简体   繁体   English

将XML转换为C#对象

[英]Converting XML to C# object

I need to get the OrderID from these xml data: 我需要从以下xml数据中获取OrderID:

<?xml version="1.0" encoding="utf-8"?>
<GetOrdersResponse xmlns="urn:ebay:apis:eBLBaseComponents">
  <Timestamp>2015-12-10T16:12:55.184Z</Timestamp>
  <Ack>Success</Ack>
  <Version>967</Version>
  <Build>e967_core_Bundled_5642307_R1</Build>
  <OrderArray>
    <Order>
      <OrderID>865826</OrderID>
      <OrderStatus>Active</OrderStatus>
   </Order>
  </OrderArray>
</GetOrdersResponse>

I have tried this one but does not work. 我已经尝试过了,但是没有用。

var xDoc = XDocument.Parse(xmlResult);
var orderElements = xDoc.Elements("GetOrdersResponse").Elements("OrderArray").Elements("Order");
foreach (XElement elem in orderElements)
{
    var orderId = Convert.ToInt32(_xmlHelper.GetChildElementValue(elem, "OrderID"));
}

Please advice. 请指教。

For such problem, i would always choose using XmlSerializer. 对于此类问题,我将始终选择使用XmlSerializer。 Use this classes: 使用此类:

    using System;
    using System.Xml.Serialization;
    using System.Collections.Generic;
    namespace classes
    {
        [XmlType(Namespace = "urn:ebay:apis:eBLBaseComponents")]
   public class Order
    {
        public int OrderID { get; set; }
        public string OrderStatus { get; set; }
    }

    [XmlType(Namespace = "urn:ebay:apis:eBLBaseComponents")]
    public class OrderArray
    {
        public List<Order> Orders { get; set; }
    }

    [XmlRoot(Namespace = "urn:ebay:apis:eBLBaseComponents")]
    public class GetOrdersResponse
    {
        public string Timestamp { get; set; }
        public string Ack { get; set; }
        public string Version { get; set; }
        public string Build { get; set; }
        public OrderArray OrderArray { get; set; }
    }

    }

Then Deserialize to your object: 然后反序列化到您的对象:

XmlSerializer serializer = new XmlSerializer(typeof(GetOrdersResponse ));
using (TextReader reader = new StringReader(xmlResult))
{
    GetOrdersResponse result = (GetOrdersResponse) serializer.Deserialize(reader);
}

int id=result.OrderArray.Orders.First().OrderID; //this will return ID of first object in Orders list.

You can follow this: 您可以遵循以下步骤:

XDocument xdoc = XDocument.Load("YourXMLFile");
var orderId = xdoc.Descendants("OrderID").FirstOrDefault().Value;

I wouldn't expect xDoc.Elements("GetOrdersResponse") to work, because that is looking in the default namespace, where-as everything here is in "urn:ebay:apis:eBLBaseComponents" . 我不希望xDoc.Elements("GetOrdersResponse")能够正常工作,因为那是在默认名称空间中进行的,这里的所有内容都在"urn:ebay:apis:eBLBaseComponents" As such, you'd need at a minimum to tell it that via XName : 这样,您至少需要通过XName告诉它:

    var xDoc = XDocument.Parse(xmlResult);
    XNamespace ns = "urn:ebay:apis:eBLBaseComponents";
    var orderElements = xDoc.Elements(ns + "GetOrdersResponse")
            .Elements(ns + "OrderArray").Elements(ns + "Order");
    foreach (XElement elem in orderElements)
    {
        var orderId = (int)elem.Element(ns + "OrderID");
    }

(note the use of (int) to do xml-specific casting, too) (还要注意使用(int)进行xml特定的转换)

However, it may be easier to just use XmlSerializer and let it worry about unscrambling the data. 但是,仅使用XmlSerializer使其担心对数据进行解密可能会更容易。

You should be use this sample code 您应该使用此示例代码

Importent Note 重要说明

  • Serialized class mark as [Serializable] attirbute 序列化的类别标记为[Serializable]服饰
  • If the class name is not same as the xml root tag, class will be mark as [XmlRoot(ElementName = "XmlTagName")] attribute 如果类名与xml根标记不同,则该类将被标记为[XmlRoot(ElementName = "XmlTagName")]属性
  • If serialized class have property type as another class, this property mark as [ XmlElement("XmlTagName")] attribute 如果序列化的类的属性类型为另一个类,则此属性标记为[ XmlElement("XmlTagName")]属性

Sample Code 样例代码

Model 模型

      [Serializable]
        [XmlRoot(ElementName = "HardwareInfo")]
        public class Hardware
        {
            [XmlElement]
            public string cpu_name { get; set; }
            [XmlElement]
            public int ram_size { get; set; }

            [XmlElement("hard_disk")]
            public List<HardDisk> hd { get; set; }                   
        }

        [Serializable]
        [XmlRoot(ElementName = "hard_disk")]
        public class HardDisk
        {
            [XmlElement]
            public string model { get; set; }
            [XmlElement]
            public string size { get; set; }
        }

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlString = @"<HardwareInfo>
                                  <cpu_name> ABC Pentium xyz</cpu_name>
                                  <ram_size> 123 </ram_size>
                                  <hard_disk>
                                    <model>Toshiba XYZ</model>
                                    <size> 123 GB </size>
                                  </hard_disk>
                                  <hard_disk>
                                    <model>Logitech XYZ</model>
                                    <size> 99 GB </size>
                                  </hard_disk>
                                </HardwareInfo>";

            var result = DeSerialization<Hardware>(xmlString);
        }

        static T DeSerialization<T>(string xmlStrig) where T : class
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));                        
            using (StringReader sReader = new StringReader(xmlStrig))
            {
                return (T)xmlSerializer.Deserialize(sReader);
            }
        }
    }          
}

You can get it using XmlDocument and XmlNodeList also - if you are saving the xml data in file 您也可以使用XmlDocumentXmlNodeList来获取它-如果XmlNodeList xml数据保存在文件中

        XmlDocument doc = new XmlDocument();
        doc.Load("your XML File Name with extension");
        XmlNodeList elemList = doc.GetElementsByTagName("OrderID");
        for (int i = 0; i < elemList.Count; i++)
        {
            Console.WriteLine(elemList[i].InnerText);
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM