2014-02-13 2 views
0

Я пытаюсь выбрать узлы с помощью XPath в C#Выбор узлов Использование XPath

Это мой файл XML

<?xml version="1.0" encoding="utf-8"?> 
<xObject version="3.0.2002.0" xmlns="http://schemas.microsoft.com/wix/2006/objects"> 
    <section id="*" type="product"> 
     <table name="NotThis"> 
       <row sourceLineNumber="D:\bla\bla\"> 
        <field>Borderish.fo</field> 
        <field>Documents</field> 
        <field>1</field> 
        <field>No, not this line here 1</field> 
       </row> 
       <row sourceLineNumber="D:\blah\blah\"> 
        <field>Charterish</field> 
        <field>Documents</field> 
        <field>1</field> 
        <field>No not, this line here 2</field> 
       </row> 
      </table> 
     <table name="XFile"> 
      <row sourceLineNumber="D:\bla\bla\"> 
       <field>Borderish.fo</field> 
       <field>Documents</field> 
       <field>1</field> 
       <field>This line here 1</field> 
      </row> 
      <row sourceLineNumber="D:\blah\blah\"> 
       <field>Charterish</field> 
       <field>Documents</field> 
       <field>1</field> 
       <field>This line here 2</field> 
      </row> 
     </table> 
    </section> 
</xObject> 

Это мой C# код, который, кажется, не работает

XmlDocument doc = new XmlDocument(); 
     doc.Load("Testing.xml"); 
     XmlNode root = doc.DocumentElement; 

     XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
     nsmgr.AddNamespace("ns", "xmlns=&quot;http://schemas.microsoft.com/wix/2006/objects&quot;"); 

     XmlNodeList nodeList = root.SelectNodes("ns:table[@type='XFile']/ns:row", nsmgr); 

     foreach (XmlNode xn in nodeList) 
     { 
      string fieldLine = xn["Field"].InnerText; 
      Console.WriteLine("Field: {4}", fieldLine); 
     } 

То, что я хочу вывести, - это каждый 4-й стол таблицы полей = «xfile», например:

This line here 1 

This line here 2 

Пожалуйста, дайте мне знать, если вы знаете решение или лучший способ.

ответ

3

Первое - вы должны обеспечить только URI для пространства имен:

nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/wix/2006/objects"); 

Второе - вы должны использовать пространство имен при предоставлении имени узла. И таблица имеет атрибут name вместо type:

XmlNodeList nodeList = root.SelectNodes("//ns:table[@name='XFile']/ns:row", nsmgr); 

И последнее - после выбора строки узлов, следует выбрать четвертый узел поля (который имеет полное имя ns:field):

foreach (XmlNode row in nodeList) 
{ 
    XmlNode field = row.SelectSingleNode("(ns:field)[4]", nsmgr); 
    Console.WriteLine("Field: {0}", field.InnerText); 
} 

Выход:

Field: This line here 1 
Field: This line here 2 

ПРИМЕЧАНИЕ. Вы можете получать поля напрямую, без циклов по строкам:

XmlNodeList fields = 
    root.SelectNodes("//ns:table[@name='XFile']/ns:row/ns:field[4]", nsmgr);