如何从我的XML文件中获取相关元素及其子元素?

时间:2014-07-04 00:08:06

标签: c# xml

我必须解析由我们的销售团队生成的XML文件。 XML看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfOrder>
  <Order>
    <Id>1</Id>
    <OrderGuid />
    <BillingAddress>
      <Id>0</Id>
      <FirstName>Harvey</FirstName>
      <LastName>Danger</LastName>
    </BillingAddress>
    <OrderItems>
      <OrderItem>
        <ProductName>Silver Widgets</ProductName>
        <Price>9.99</Price>
        <Quantity>10</Quantity>
        <OrderDate>7/2/2014 2:05:00 PM</OrderDate>
        <Barcodes>
          <BarCode>
            <string>123CC2D68</string>
          </BarCode>
        </Barcodes>
      </OrderItem>
    </OrderItems>
  </Order>
</ArrayOfOrder>

我可以列出Order Node中的所有元素,然后我可以遍历特定节点的子节点。但是,我无法弄清楚如何从BillingAddress节点获取订单ID和相应的名字和姓氏。我已尝试过以下代码的许多不同变体,但无法解决此问题:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(filePath);

    XmlElement root = xmlDoc.DocumentElement;
    XmlNodeList Order = root.SelectNodes("Order");

    string id1 = string.Empty;
    string firstName = string.Empty;
    string lastName = string.Empty;

    foreach(XmlNode order in Order)
    {
        id1 = order["Id"].InnerText;
        //firstName = order["BillingAddress/FirstName"].InnerText;
        //lastName = order["BillingAddress"].InnerText;
        firstName = order["FirstName"].InnerText;
        lastName = order["LastName"].InnerText;

        Console.WriteLine(id1);
        Console.WriteLine("\t" + firstName);
        Console.WriteLine("\t" + lastName);
    }

我正在努力完成这样的事情

1  哈维  危险

那么我如何为相应的Id设置名字和姓氏?

2 个答案:

答案 0 :(得分:1)

您可以获取结算地址的XmlNode并使用FirstChild

http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.firstchild.aspx

您也可以选择SelectSingleNode

http://msdn.microsoft.com/en-us/library/fb63z0tw.aspx

这是xPath语法指南

http://www.w3schools.com/xpath/xpath_syntax.asp

答案 1 :(得分:1)

如果您在使用XML方法方面有一定的灵活性,则应考虑转向 LINQ to XML 。来自MSDN上的LINQ to XML Overview

  

LINQ to XML是一种最新的,经过重新设计的编程方法   XML。它提供了内存中的文档修改功能   文档对象模型(DOM),并支持LINQ查询表达式。   虽然这些查询表达式在语法上不同于   XPath,它们提供类似的功能。

另请参阅LINQ to XML vs. DOM,其中介绍了两个API之间的一些基本差异。

这是一个完整的工作示例,演示了LINQ to XML(System.Xml.Linq)对您提供的示例数据的基本用法。获得LINQ的基本知识后,您可以做更多的事情。我认为您会发现Getting Started with LINQ in C#相对容易阅读,非常值得您花时间。在使用.NET编程时,LINQ本身将显着提高您的工作效率。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LinqToXmlDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string xmlContent = GetXml();

            XElement arrayOfOrder = XElement.Parse(xmlContent);

            XElement order = arrayOfOrder.Element("Order");
            string orderId = (string)order.Element("Id");            

            XElement billingAddress = order.Element("BillingAddress");
            string firstName = (string)billingAddress.Element("FirstName");
            string lastName = (string)billingAddress.Element("LastName");

            Console.WriteLine("[{0}] [{1}] [{2}]",
                orderId,
                firstName,
                lastName);
        }

        private static String GetXml()
        {
            return
                @"<?xml version='1.0' encoding='utf-8'?>
                  <ArrayOfOrder>
                    <Order>
                      <Id>1</Id>
                      <OrderGuid />
                      <BillingAddress>
                        <Id>0</Id>
                        <FirstName>Harvey</FirstName>
                        <LastName>Danger</LastName>
                      </BillingAddress>
                      <OrderItems>
                        <OrderItem>
                          <ProductName>Silver Widgets</ProductName>
                          <Price>9.99</Price>
                          <Quantity>10</Quantity>
                          <OrderDate>7/2/2014 2:05:00 PM</OrderDate>
                          <Barcodes>
                            <BarCode>
                              <string>123CC2D68</string>
                            </BarCode>
                          </Barcodes>
                        </OrderItem>
                      </OrderItems>
                    </Order>
                  </ArrayOfOrder>";
        }        
    }
}