2008-12-17 2 views
1

J'ai quelques XML dans le format suivant:ASP.NET InnerXml automatiquement/annexant correctement le texte d'attribut à des balises

<somenode> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <head> 
      <title/> 
     </head> 
     <body> 
      <p>P one</p> 
      <p>Another p</p> 
     </body> 
    </html> 
</somenode> 

Niché il y a un html, que je ne pensais pas que serait une question aussi il serait juste traité comme xml.

J'essaie de sélectionner le contenu (InnerXml) de la balise <body>. Cependant, l'utilisation

xmlDoc.SelectSingleNode("somenode/html/body") 

retours null, et en utilisant

xmlDoc.GetElementsByTagName("body")[0].InnerXml 

donne la InnerXml - mais chaque <p> a xmlns="http://www.w3.org/1999/xhtml" joint à elle - donc le résultat ressemble à:

<p xmlns="http://www.w3.org/1999/xhtml">P one</p><p xmlns="http://www.w3.org/1999/xhtml">Another p</p> 

Quelqu'un peut-il nous éclairer là-dessus? On dirait un comportement vraiment bizarre, toute aide serait appréciée. J'utilise seulement ASP.net 2.0, donc malheureusement essayer linq n'est pas une option.

+0

Brillant, merci les deux :) très apprécié – Gwilym

Répondre

0

Votre expression xpath ne spécifie pas l'espace de noms par défaut. Que diriez-vous:

XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable); 
nsMgr.AddNamespace("xhtml", "http://www.w3.org/1999/xhtml"); 

XmlNode node = xmlDoc.SelectSingleNode("somenode/xhtml:html/xhtml:body", nsMgr); 
0

Étant donné que l'élément <html> définit l'espace de noms par défaut comme étant http://www.w3.org/1999/xhtml. Tous les éléments qui s'y trouvent sans préfixe d'espace de nommage ont le même espace de noms par défaut.

Étant donné que le contenu de l'étiquette de corps est 2 éléments distincts <p>, ils obtiennent tous les deux la déclaration. Si vous avez d'autres éléments à l'intérieur de vos éléments <p>, ils n'auront pas la déclaration sur eux.

Questions connexes