2016-07-16 3 views
0

У меня есть следующий XML, и я пытаюсь прочитать раздел related_items в списке, но мой код не возвращаетУ меня есть следующий XML и я пытаюсь прочитать раздел related_items в списке, но мой код не возвращает результат

<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> 

XML - это XmlNode. Я загружая его в XDocument и у меня есть этот код

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

Но она возвращает пустой список

Даже с кодом

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

запрос получает нулевое значение.

Что мне не хватает?

Спасибо

ответ

1

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

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

Обратите внимание, что элементы-потомки не имеющие префикс INHERIT предка пространства имен по умолчанию неявно. Вы можете использовать локальное имяXNamespace + элемента для ссылки на элемент непустого пространства имен:

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

Я попытался это уже, но я получаю следующее сообщение об ошибке: Дополнительная информация: символ «:», шестнадцатеричное значение 0x3a , не могут быть включены в имя. Любое обходное решение? – bzamfir

+0

На самом деле это сработало. Мой исходный (неправильный) код был var d = "http://server.com/specs_xml_2_0.xsd"; вместо XNamespace d = "http://server.com/specs_xml_2_0.xsd"; – bzamfir

0

Я поставил этот VB вместе как тест. Кажется, это работает.

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