帮助解析XML,简单的字符串 - 但我似乎无法解析它

时间:2010-10-18 00:46:37

标签: c# xml xpath xml-serialization xml-namespaces

我有以下XML:

<iq xmlns="jabber:client" to="39850777771287777738178727@guest.google.com/agsXMPP" xml:lang="en" id="sub23" from="search.google.com" type="result">
    <pubsub xmlns="http://jabber.org/protocol/pubsub">
        <subscription subscription="subscribed" subid="5077774B57777BD77770" node="search" jid="39850777771287777738178727@guest.google.com/agsXMPP" />
    </pubsub>
</iq>

我尝试使用linq解析为sql,但似乎并不理解这些是不同的节点。它将整个iq分组为一个元素。

任何人都可以帮助使用XML解析它吗?

我想获得的数据是subid =“5077774B57777BD77770”和id =“sub23”

谢谢!

编辑:

这是我的代码,尝试以两种方式进行:

XDocument doc = XDocument.Parse("<xml>" + iq.ToString() + "</xml>");
        var results = from feed in doc.Elements("xml")
                       select new
                       {
                           Id = (string)feed.Element("iq").Attribute("id"),
                           Subid = (string)feed.Element("iq").Element("pubsub").Element("subscription").Attribute("subid")
                       };

                var doc = new System.Xml.XmlDocument();
            doc.LoadXml(iq.ToString());
            var searchId = doc.Attributes["id"];
            var subid = doc.SelectSingleNode("/pubsub/subscription").Attributes["subid"];

4 个答案:

答案 0 :(得分:3)

正如Dimitre指出的那样,你有一个命名空间问题。这将有效:

    using System;
using System.Xml;

namespace XMLTest
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
             XmlNamespaceManager namespaces = new XmlNamespaceManager(doc.NameTable);
            namespaces.AddNamespace("ns1", "jabber:client");
            namespaces.AddNamespace("ns2", "http://jabber.org/protocol/pubsub");
            doc.Load("xmltest.xml");

            XmlNode iqNode = doc.SelectSingleNode("/ns1:iq", namespaces);
            string ID = iqNode.Attributes["id"].Value;
            Console.WriteLine(ID);

            XmlNode subscriptionNode = doc.SelectSingleNode("/ns1:iq/ns2:pubsub/ns2:subscription", namespaces);
            string subID = subscriptionNode.Attributes["subid"].Value;
            Console.WriteLine(subID);

            Console.ReadLine();
        }
    }
}

答案 1 :(得分:2)

阅读this以获取解释和完整的代码示例如何评估XPath表达式,该表达式包含名称位于默认命名空间中且在XML文档中未加前缀的节点的位置步骤..

答案 2 :(得分:1)

我不确定这是不是你所追求的,但它有效:

XNamespace jabber = "jabber:client";
XNamespace pubsub = "http://jabber.org/protocol/pubsub";

string xmltext = "<iq xmlns=\"jabber:client\" to=\"39850777771287777738178727@guest.google.com/agsXMPP\" xml:lang=\"en\" id=\"sub23\" from=\"search.google.com\" type=\"result\">\n"
    + "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">\n"
    + "<subscription subscription=\"subscribed\" subid=\"5077774B57777BD77770\" node=\"search\" jid=\"39850777771287777738178727@guest.google.com/agsXMPP\" />\n"
    + "</pubsub>\n"
    + "</iq>";

XDocument xdoc = XDocument.Parse(xmltext);

var iqelem = xdoc.Element(jabber + "iq");
var id = iqelem.Attribute("id").Value;

var subselem = iqelem.Element(pubsub + "pubsub").Element(pubsub + "subscription");
var subid = subselem.Attribute("subid").Value;

Console.WriteLine("SubId = {0}\nId={1}", subid, id);

答案 3 :(得分:0)

我同意Dimitre - 顶部的“空”xmlns命名空间可能导致问题。我有时会使用正则表达式删除它们,如果它们没有被使用,否则按照描述使用XmlNameSpaceManager