2012-09-18 73 views
0

我做了一个API调用时返回了以下XML。我需要创建一个数组,其中包含<order_status>,<payment_status><fulfillment_status>中的每一个的<status><description>值。任何人都可以分享一些可以帮助我的知识吗?从c#中的xml数据创建一个数组#

<orderwave> 
    <call_result> 
    <order> 
     <order_number>17377</order_number> 
     <orderwave_order_number>RWD-336475921</orderwave_order_number> 
     <order_status> 
     <status>active</status> 
     <description>This order is free to be charged and shipped. It is open in the orderwave workflow.</description> 
     </order_status> 
     <payment_status> 
     <status>declined</status> 
     <description>This order has been declined by the payment network.</description> 
     </payment_status> 
     <fulfillment_status> 
     <status>not shipped</status> 
     <description>This order has not been allocated for shipment.</description> 
     </fulfillment_status> 
    </order> 
    </call_result> 
    <warning_count>0</warning_count> 
    <warnings/> 
    <error_count>0</error_count> 
    <errors/> 
</orderwave> 
+0

您应该使用linqToXML可能 –

+0

看一看使用'List ','T'是一个对象来保存您想要的数据,然后使用LINQ to XML将文档解析到List中。如果我稍后再来,我会发布一个例子。 – Tim

+0

这个数组中存储的对象的类型是什么?你想简单地将XML分解为更小的XDocument,还是需要更强大的类型化方法? – Vitaliy

回答

0

LinqToXML是你想要我相信。

我有一段时间没有这样做,所以我的语法可能不完美。

事情是这样的:

var xmlSource = contacts.Load(@"../../return.xml"); 

var q = xmlSource.Descendants("order").SelectMany(x => x.Elements("order_status") 
0

要在我先前的评论,一个简单,快捷的方式做到这一点是List<T> ClassLINQ to XML扩大。

使用一个类来保存数据,每个订单 - 例如:

public class Order 
{ 

    public int OrderNumber { get; set; } 
    public string OrderStatus { get; set; } 
    public string OrderDescription { get; set; } 
    public string PaymentStatus { get; set; } 
    public string PaymentDescription { get; set; } 
    public string FulfillmentStatus { get; set; } 
    public string FulfillmentDescription { get; set; } 
} 

接下来,您可以将XML加载到一个XDocument,与LINQ解析它以XML和创建Order对象的列表:

// Parse the XML string; you can also load the XML from a file. 
XDocument xDoc = XDocument.Parse("<orderwave>....</orderwave>"); 

// Get a collection of elements under each order node 
var orders = (from x in xDoc.Descendants("order") 
// Use the data for each order node to create a new instance of the order class 
       select new Order 
       { 
        OrderNumber = ConvertTo.Int32(x.Element("order_number").Value), 
        OrderStatus = x.Element("order_status").Element("status").Value, 
        OrderDescription = x.Element("order_status").Element("description").Value, 
        PaymentStatus = x.Element("payment_status").Element("status").Value, 
        PaymentDescription = x.Element("payment_status").Element("description").Value, 
        FulfillmentStatus = x.Element("fulfillment_status").Element("status").Value, 
        FulfillmentDescription = x.Element("fulfillment_status").Element("description").Value 
       }).ToList(); 
      // Convert the result to a list of Order objects 

这没有经过测试就脱离了我的头顶,但如果您想使用列表而不是数组,它应该指向正确的方向。