Помощь в разборе XML, простая строка - но я не могу разобрать его - PullRequest
3 голосов
/ 18 октября 2010

У меня есть следующий 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 to sql, но, похоже, он не понимает, что это разные узлы. Он группирует весь iq в один элемент.

Может ли кто-нибудь помочь разобрать это с помощью XML?

Данные, которые я хочу получить, это subid = "5077774B57777BD77770" и id = "sub23"

Спасибо!

Edit:

Вот код, который я имею, попытался сделать это двумя способами:

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 ]

3 голосов
/ 18 октября 2010

Как указал Димитр, у вас проблема с пространством имен.Это будет работать:

    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();
        }
    }
}
2 голосов
/ 18 октября 2010

Прочитайте это для объяснения и полного примера кода как оценить выражение XPath, которое содержит шаги расположения с узлами, имена которых находятся в пространстве имен по умолчанию и не имеют префикса в XML документ ..

1 голос
/ 18 октября 2010

Я не уверен, что это то, что вам нужно, но это работает:

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);
0 голосов
/ 18 октября 2010

Я согласен с Dimitre - «пустое» пространство имен xmlns вверху, вероятно, вызывает проблему.Я иногда удаляю их с помощью регулярных выражений, если они не используются, в противном случае поиграйтесь с XmlNameSpaceManager, как описано

...