从 c# 中的多级(嵌套)XML 文档访问元素
Accessing Elements from multi-level (nested) XML documents in c#
我正在使用 API 从服务器中提取 XML 数据并使用 LINQ 将结果存储在匿名对象列表中,但是一些数据正在返回 "null" 并且我认为这一定是由于 XML 文档层次结构。见下文-
<export type="orderexport" date="13/01/2015" time="5:01:18 PM">
<order>
<OrderNumber>149612</OrderNumber>
<CustomerNumber>146538</CustomerNumber>
<Currency>AUD</Currency>
<Locale>en_AU</Locale>
<GrandTotal>1548.98</GrandTotal>
<TotalBeforeTax>1411.58</TotalBeforeTax>
<TotalTax>137.4</TotalTax>
<Addresses>
<BillingAddress>
<Email>XXXXXX@XXXXXXX.com.au</Email>
</BillingAddress>
<ShippingAddress>
<Email>XXXXXX@XXXXXXX.com.au</Email>
</ShippingAddress>
</Addresses>
<LineItems>
<LineItem>...</LineItem>
<LineItemSalesDiscount>...</LineItemSalesDiscount>
<LineItemDiscount>...</LineItemDiscount>
<LineItemShipping>...</LineItemShipping>
<LineItemPayment>...</LineItemPayment>
<LineItemPaymentDiscount>...</LineItemPaymentDiscount>
</LineItems>
<CreationDate>13/01/2015 9:42:59 AM</CreationDate>
<ViewedOn>13/01/2015 9:44:20 AM</ViewedOn>
<cancelledon/>
<readyforshippingon>13/01/2015 1:58:41 PM</readyforshippingon>
<paidon>13/01/2015 9:43:15 AM</paidon>
<ordercomment>
removed
</ordercomment>
</order>
</export>
我可以在第一级很好地提取所有元素,但是我需要包含标签,但它嵌套在另一个级别下,当我尝试获取它的值时,就像我获取它的其余部分一样,我得到一个 null值。
//Create Request
myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
myHttpWebRequest.Method = "GET";
myHttpWebRequest.ContentType = "text/xml; encoding='utf-8'";
//Get Response
myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
//Load response stream into XMLReader
myXMLReader = new XmlTextReader(myHttpWebResponse.GetResponseStream());
var xdoc = XDocument.Load(myXMLReader);
var result = from x in xdoc.Root.Elements()
select new
{
OrderNumber = (string)x.Element("OrderNumber"),
CustomerNumber = (string)x.Element("CustomerNumber"),
GrandTotal = (double)x.Element("GrandTotal"),
Email = (string)x.Element("Email")
};
输出:“{ OrderNumber = “149612”,CustomerNumber = “146538”,GrandTotal = 1548.98,Email = null }”
我以前从未读过 XML 文档,但我相当确定上面的代码是正确的,我确定我只需要更改电子邮件的 LINQ 表达式行,但我不知道它应该是什么。
此致
由于 Email
存在于 Addresses\BillingAddress
中,您需要像这样提取电子邮件:-
Email = x.Descendants("BillingAddress")
.Select(e => (string)e.Element("Email")).FirstOrDefault()
请注意,我只获取 BillingAddress
节点内的电子邮件地址,如果你想要 ShippingAddress
节点内的电子邮件地址,你可以这样做:-
Email = x.Descendants("ShippingAddress")
.Select(e => (string)e.Element("Email")).FirstOrDefault();
你可以试试最简单的方法。如您所知,API、
返回的 XML 结构
- 创建具有相似结构的 'Order' class。
- 将您的 XML 数据保存到临时文件。
- 使用 XmlSerializer 反序列化您的 XML 文件并将其转换为 'Order' 类型。
- 现在您可以访问对象属性中的所有数据。
This link 展示了如何做到这一点。
我正在使用 API 从服务器中提取 XML 数据并使用 LINQ 将结果存储在匿名对象列表中,但是一些数据正在返回 "null" 并且我认为这一定是由于 XML 文档层次结构。见下文-
<export type="orderexport" date="13/01/2015" time="5:01:18 PM">
<order>
<OrderNumber>149612</OrderNumber>
<CustomerNumber>146538</CustomerNumber>
<Currency>AUD</Currency>
<Locale>en_AU</Locale>
<GrandTotal>1548.98</GrandTotal>
<TotalBeforeTax>1411.58</TotalBeforeTax>
<TotalTax>137.4</TotalTax>
<Addresses>
<BillingAddress>
<Email>XXXXXX@XXXXXXX.com.au</Email>
</BillingAddress>
<ShippingAddress>
<Email>XXXXXX@XXXXXXX.com.au</Email>
</ShippingAddress>
</Addresses>
<LineItems>
<LineItem>...</LineItem>
<LineItemSalesDiscount>...</LineItemSalesDiscount>
<LineItemDiscount>...</LineItemDiscount>
<LineItemShipping>...</LineItemShipping>
<LineItemPayment>...</LineItemPayment>
<LineItemPaymentDiscount>...</LineItemPaymentDiscount>
</LineItems>
<CreationDate>13/01/2015 9:42:59 AM</CreationDate>
<ViewedOn>13/01/2015 9:44:20 AM</ViewedOn>
<cancelledon/>
<readyforshippingon>13/01/2015 1:58:41 PM</readyforshippingon>
<paidon>13/01/2015 9:43:15 AM</paidon>
<ordercomment>
removed
</ordercomment>
</order>
</export>
我可以在第一级很好地提取所有元素,但是我需要包含标签,但它嵌套在另一个级别下,当我尝试获取它的值时,就像我获取它的其余部分一样,我得到一个 null值。
//Create Request
myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
myHttpWebRequest.Method = "GET";
myHttpWebRequest.ContentType = "text/xml; encoding='utf-8'";
//Get Response
myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
//Load response stream into XMLReader
myXMLReader = new XmlTextReader(myHttpWebResponse.GetResponseStream());
var xdoc = XDocument.Load(myXMLReader);
var result = from x in xdoc.Root.Elements()
select new
{
OrderNumber = (string)x.Element("OrderNumber"),
CustomerNumber = (string)x.Element("CustomerNumber"),
GrandTotal = (double)x.Element("GrandTotal"),
Email = (string)x.Element("Email")
};
输出:“{ OrderNumber = “149612”,CustomerNumber = “146538”,GrandTotal = 1548.98,Email = null }”
我以前从未读过 XML 文档,但我相当确定上面的代码是正确的,我确定我只需要更改电子邮件的 LINQ 表达式行,但我不知道它应该是什么。
此致
由于 Email
存在于 Addresses\BillingAddress
中,您需要像这样提取电子邮件:-
Email = x.Descendants("BillingAddress")
.Select(e => (string)e.Element("Email")).FirstOrDefault()
请注意,我只获取 BillingAddress
节点内的电子邮件地址,如果你想要 ShippingAddress
节点内的电子邮件地址,你可以这样做:-
Email = x.Descendants("ShippingAddress")
.Select(e => (string)e.Element("Email")).FirstOrDefault();
你可以试试最简单的方法。如您所知,API、
返回的 XML 结构- 创建具有相似结构的 'Order' class。
- 将您的 XML 数据保存到临时文件。
- 使用 XmlSerializer 反序列化您的 XML 文件并将其转换为 'Order' 类型。
- 现在您可以访问对象属性中的所有数据。
This link 展示了如何做到这一点。