XML具有多个值节点

时间:2015-09-09 13:53:52

标签: c# xml xml-parsing treenode

更新:我只能下到我的XML中的第一个值节点。 下面的代码到达第一个值节点并显示数据,但我如何选择另一个节点?我现在每个项目节点只需要3个值。税年,账单号和appl_amt以及图像路径是我正在检索的唯一值。添加的Xml只是一部分。添加的部分重复几次,直到BatchCompiler / Batch / transactions / transaction标记关闭分组。

   <?xml version="1.0"?>
 <BatchCompiler>
<batch>
   <batchid>95531</batchid>
   <transactions>
        <transaction>
            <items>
              <item>
                <values>
                  <value>
                     <name>doc_type</name>
                     <data>1</data> 
                  </value>
                  <value>
                    <name>doc_id</name>
                    <data>10</data>
                 </value>
                   <value>
                    <name>Bill Base Number</name>
                    <data>0007956700</data>
                 </value>
                 <value>
                    <name>Tax Year</name>
                    <data>2015</data>
                </value>
                 <value>
                    <name>Year For</name>
                    <data>2015</data> 
               </value>
                <value>
                   <name>Listing Type</name>
                   <data>0000</data>
              </value>
               <value>
                  <name>Postmark Date</name>
                   <data>08212015</data>
             </value>
            <value>
                   <name>appl_amt</name>
                   <data>18.12</data>
            </value>
            <value>
                    <name>tran_num</name>
                    <data>1</data>
           </value>
           <value>
                   <name>tran_seq</name>
                   <data>1</data>
           </value>
          </values>
          <image>..\images\95531_1_S_1.tif</image>
     </item>

 namespace GETZIP2
 {
 class Program
 {
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("\\example\\index.xml);  
        MessageBox.Show(doc.SelectSingleNode("BatchCompiler/batch/transactions/transaction/items/item/values/value").InnerText);

    }

    }

 }

2 个答案:

答案 0 :(得分:1)

LINQ to XML是比旧XmlDocument DOM更好的API,而LINQ to XML的查询方法比使用XPath更好。

这样的东西可能会起作用,但是如果你展示了一些XML并且对你真正想要的值有更具体的了解会有所帮助。

var doc = XDocument.Load(@"\example\index.xml");

foreach (var value in doc.Descendants("value"))
{
    var name = (string)value.Element("name");
    var data = (string)value.Element("data");

    // do something with these
}

如果您想查询特定的键/值对,可以执行以下操作:

var taxYear = doc.Descendants("value")
    .Where(e => (string)e.Element("name") == "Tax Year")
    .Select(e => (string)e.Element("data")
    .Single();

您甚至可以考虑创建所有键/值对的字典:

var keyValues = doc.Descendants("value")
    .ToDictionary(e => (string)e.Element("name"), e => (string)e.Element("data"));

var taxYear = keyValues["TaxYear"];
var billNumber = keyValues["Bill Base Number"];

答案 1 :(得分:-1)

除了Linq to XML之外,您还可以使用XmlReader类。它提供ReadToNextSibling等功能,帮助您通过兄弟姐妹。

ReadToDescendantMoveToNextAttribute等其他功能可能派上用场。

XmlReader reader = XmlReader.Create(@"\example\index.xml");

// Move to the desired element.
reader.MoveToContent();
reader.ReadToDescendant("value");