2016-07-16 19 views
0

Ich habe die folgende XML und ich versuche, die related_items Abschnitt in eine Liste zu lesen, aber mein Code gibt keine zurück ErgebnisIch habe die folgende XML und ich versuche, die related_items Abschnitt in eine Liste zu lesen, aber mein Code gibt kein Ergebnis zurück

<classification xmlns="http://server.com/specs_xml_2_0.xsd"> 
    <minor_class_code>CONVHD</minor_class_code> 
    <minor_class_description>CONVERTIBLE HOOD</minor_class_description> 
    <color_code>S</color_code> 
    <color_code_description>Stainless Steel</color_code_description> 
    <this_item_in_other_colors> 
     <product> 
      <key>BOSCH:DUH30122UC</key> 
      <color_code>W</color_code> 
      <color_code_description>White</color_code_description> 
     </product> 
     <product> 
      <key>BOSCH:DUH30162UC</key> 
      <color_code>B</color_code> 
      <color_code_description>Black</color_code_description> 
     </product> 
    </this_item_in_other_colors> 
    <width_string>30</width_string> 
    <related_items> 
     <related_item_key>BOSCH:DHZ3002UC</related_item_key> 
     <related_item_key>BOSCH:D889872UC</related_item_key> 
    </related_items> 

Das XML ist ein XmlNode. Ich bin in ein XDocument geladen und ich habe diesen Code

var xdoc = XDocument.Load(new XmlNodeReader(node)); 
var query = xdoc.Descendants("related_item_key").Select(x => x.Value).ToList(); 

Aber es gibt leere Liste

Auch mit dem Code

var query = xdoc.Root.Element("related_items"); 

Abfrage Wert null erhält.

Was fehlt mir?

Danke

Antwort

1

Ihr Code nicht Standard-Namespace betrachten, die an der Wurzel Element deklariert:

xmlns="http://server.com/specs_xml_2_0.xsd" 

Beachten Sie, dass implizit Elemente ohne Präfix erben Vorfahren Standard-Namespace-Nachkommen. Sie können XNamespace + Element der lokalen Namen auf Referenzelement in einem nicht leeren Namespace verwenden:

XNamespace d = "http://server.com/specs_xml_2_0.xsd"; 
var query = xdoc.Descendants(d+"related_item_key") 
       .Select(x => x.Value) 
       .ToList(); 
+0

ich dies bereits versucht, aber ich bekomme die folgende Fehlermeldung: Weitere Informationen: Der ‚:‘ Zeichen, hexadezimalen Wert 0x3A , kann nicht in einem Namen enthalten sein. Irgendeine Problemumgehung? – bzamfir

+0

Eigentlich hat es funktioniert. Mein ursprünglicher (falscher) Code war var d = "http://server.com/specs_xml_2_0.xsd"; anstelle von XNamespace d = "http://server.com/specs_xml_2_0.xsd"; – bzamfir

0

ich dies als eine harte Probe gestellt VB zusammen. Es scheint zu funktionieren.

Imports <xmlns="http://server.com/specs_xml_2_0.xsd"> 
Public Class Form1 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim xe As XElement 
     xe = <classification xmlns="http://server.com/specs_xml_2_0.xsd"> 
       <minor_class_code>CONVHD</minor_class_code> 
       <minor_class_description>CONVERTIBLE HOOD</minor_class_description> 
       <color_code>S</color_code> 
       <color_code_description>Stainless Steel</color_code_description> 
       <this_item_in_other_colors> 
        <product> 
         <key>BOSCH:DUH30122UC</key> 
         <color_code>W</color_code> 
         <color_code_description>White</color_code_description> 
        </product> 
        <product> 
         <key>BOSCH:DUH30162UC</key> 
         <color_code>B</color_code> 
         <color_code_description>Black</color_code_description> 
        </product> 
       </this_item_in_other_colors> 
       <width_string>30</width_string> 
       <related_items> 
        <related_item_key>BOSCH:DHZ3002UC</related_item_key> 
        <related_item_key>BOSCH:D889872UC</related_item_key> 
       </related_items> 
      </classification> 

     Dim relatedItemsSection As IEnumerable(Of XElement) 

     relatedItemsSection = xe...<related_items> 

     Dim relatedItems As IEnumerable(Of XElement) 

     relatedItems = relatedItemsSection...<related_item_key> 

    End Sub 
End Class