2014-02-13 44 views
0

我想选择在C#选择节点使用XPath

使用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);