2010-10-18 4 views
3

je le code XML suivant:Aide en parsing XML, chaîne simple - mais je ne peux pas sembler l'analyser

<iq xmlns="jabber:client" to="[email protected]/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="[email protected]/agsXMPP" /> 
    </pubsub> 
</iq> 

J'ai essayé avec l'analyse syntaxique LINQ to SQL, mais il ne semble pas comprendre que ce sont des nœuds différents. Il regroupe l'ensemble de l'iq en un seul élément.

Quelqu'un peut-il aider à l'analyser en utilisant XML?

Les données que je veux est le subid = "5077774B57777BD77770" et id = "sub23"

Merci!

Edit:

Voici le code que je l'ai, il a essayé de faire de deux façons:

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") 
         }; 

et

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

s'il vous plaît montrer le code que vous avez – Hogan

+0

@Hogan vient d'être ajouté le code que j'avais ci-dessus – rksprst

+0

Bonne question, +1. Voir ma réponse pour une référence à une explication et un exemple de code complet comment construire des expressions XPath lorsque le document XML a un espace de noms par défaut. –

Répondre

3

Comme Dimitre l'a souligné, vous avez un problème d'espace de noms. Cela fonctionne:

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(); 
     } 
    } 
} 
+0

Merci, ça marche très bien. Je n'ai pas réalisé que vous pouvez simplement ajouter votre propre "ns1", "ns2" pour les espaces de noms qui n'ont pas de préfixe utilisé. – rksprst

+0

hjd: Bonne réponse. Mais, pourquoi ne sélectionnez-vous pas les attributs avec XPath? –

+0

Bon point, aurait tout aussi bien pu faire: 'chaîne ID = doc.SelectSingleNode ("/ns1: iq/@ id ", espaces de noms) .Value;' – hjd

2

Lire this une explication et un exemple de code complet comment évaluer une expression XPath contenant des étapes d'emplacement avec des noeuds dont les noms se trouvent dans un espace de noms par défaut refixed dans le document XML ..

0

Je suis d'accord avec Dimitre - l'espace de noms xmlns "vide" en haut est probablement à l'origine du problème. Je les supprime parfois avec une regex s'ils ne sont pas utilisés, sinon je joue avec XmlNameSpaceManager comme décrit

+1

J'espère que la confusion des idées qui vous amènerait à décrire une déclaration d'espace de noms sans abréviation comme "vide" n'est pas aussi profonde qu'elle en a l'air. Supprimer les déclarations d'espace de noms du XML source revient à remplacer un fusible par un centime: ce n'est pas parce que vos lumières s'allument que tout va bien. –

1

Je ne sais pas si c'est ce que vous êtes après, mais cela fonctionne:

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

string xmltext = "<iq xmlns=\"jabber:client\" to=\"[email protected]/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=\"[email protected]/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); 
Questions connexes