如何在C#中解析Xml中的元素?

时间:2018-03-30 16:06:03

标签: c# xml xml-parsing

我正在使用xamarin工作室,我有一个xml作为SOAP请求的响应,我想从该xml中解析出一些元素。 这是xml: -

<?xml version="1.0"?>

-<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">


-<s:Header>

<IsActive xmlns="http://CTRMService/CTRM">true</IsActive>

</s:Header>


-<s:Body>


-<GetAllCompanyResponse xmlns="http://CTRMService/CTRM">


-<GetAllCompanyResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:a="http://schemas.datacontract.org/2004/07/DTOModelLayer.DTO">


-<a:DTOCtrmSetupCompany>

<a:Agent_Company_Id i:nil="true"/>

<a:Bsc_Party_Id i:nil="true"/>

<a:CTRM_SETUP_COMPANY_ADDRESS i:nil="true"/>

<a:CTRM_SETUP_COMPANY_BANK_INFO i:nil="true"/>

<a:CTRM_SETUP_COMPANY_BUSINESS_UNIT i:nil="true"/>

<a:CTRM_SETUP_COMPANY_TAX_REGION i:nil="true"/>

<a:CTRM_SETUP_COUNTERPARTY_DETAIL i:nil="true"/>

<a:CTRM_SETUP_PERSON_COMPANY_LINK i:nil="true"/>

<a:Company_Affiliation_Code i:nil="true"/>

<a:Company_Affiliation_Id i:nil="true"/>

<a:Company_Certified_Enum i:nil="true"/>

<a:Company_Code>BNP SINGAPORE</a:Company_Code>

<a:Company_Eic_Code i:nil="true"/>

<a:Company_Group_Code i:nil="true"/>

<a:Company_Id>2</a:Company_Id>

<a:Company_Legal_Long/>

<a:Company_Name>BNP SINGAPORE</a:Company_Name>

<a:Company_Netting_Enum i:nil="true"/>

<a:Company_Registration_Id/>

<a:Company_Self_Billed_Enum i:nil="true"/>

<a:Company_Type_Enum>Bank</a:Company_Type_Enum>

<a:Conf_Signing_Person2_Id i:nil="true"/>

<a:Conf_Signing_Person_Id i:nil="true"/>

<a:Counterpart_External_Limit i:nil="true"/>

<a:Counterpart_External_Limit_Uom_Id i:nil="true"/>

<a:Counterpart_Internal_Limit i:nil="true"/>

<a:Counterpart_Internal_Limit_Uom_Id i:nil="true"/>

<a:Credit_Clause_Code i:nil="true"/>

<a:Customer_Id>1</a:Customer_Id>

<a:Delivery_Term_Id i:nil="true"/>

<a:Division_Id i:nil="true"/>

<a:Doing_Business_As_Long/>

<a:Duns_Id i:nil="true"/>

<a:External_Ref/>

<a:Federal_Tax_Id i:nil="true"/>

<a:Gl_Code/>

<a:Incorporation_Date i:nil="true"/>

<a:Interface_Value_Code i:nil="true"/>

<a:Internal_Co_Group_Code i:nil="true"/>

<a:Is_Broker i:nil="true"/>

<a:Is_Counterpart i:nil="true"/>

<a:Is_Kyc_Done_Enum>false</a:Is_Kyc_Done_Enum>

<a:Iso_Participant_Id i:nil="true"/>

<a:Last_Modify_Date>2017-11-01T16:45:00.237</a:Last_Modify_Date>

<a:Legal_Entity_Id i:nil="true"/>

<a:Lock_Id>2</a:Lock_Id>

<a:Modify_Person_Id>1</a:Modify_Person_Id>

<a:Nerc_Id i:nil="true"/>

<a:Parent_Company_Id>0</a:Parent_Company_Id>

<a:Payment_Term_Id>0</a:Payment_Term_Id>

<a:Restricted_Enum>TradingAllowed</a:Restricted_Enum>

<a:Status_Enum>true</a:Status_Enum>

<a:Vat_Rate i:nil="true"/>

</a:DTOCtrmSetupCompany>

(我没有发布完整的XML,因为它太长了) 我想解析<a:Company_Name>元素,但问题是10-15 <a:DTOCtrmSetupCompany>所有这些元素都包含<a:Company_Name>中的不同数据和公司,我如何从这些中获取所有公司元素?

编辑 - 我想根据“a:Company_Type_Enum”元素对公司进行排序,例如:如果公司是“银行”,那么它将被添加到名为bank的列表中。

1 个答案:

答案 0 :(得分:0)

使用xml linq,如下面的代码:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            new DTOCtrmSetupCompany(FILENAME);
            DTOCtrmSetupCompany.Display();
            Console.ReadLine();
        }
    }
    public class DTOCtrmSetupCompany
    {
        public static Dictionary<string, List<DTOCtrmSetupCompany>> companies = new Dictionary<string, List<DTOCtrmSetupCompany>>();

        public int Company_Id { get; set; }
        public DateTime Last_Modify_Date { get; set; }
        public string Company_Type_Enum { get; set; }

        public DTOCtrmSetupCompany() { }
        public DTOCtrmSetupCompany(string filename)
        {
            string xml = File.ReadAllText(filename);

            XDocument doc = XDocument.Parse(xml);

            XElement getAllCompanyResult = doc.Descendants().Where(x => x.Name.LocalName == "GetAllCompanyResult").FirstOrDefault();

            XNamespace nsA = getAllCompanyResult.GetNamespaceOfPrefix("a");

            companies = getAllCompanyResult.Elements(nsA + "DTOCtrmSetupCompany").Select(x => new DTOCtrmSetupCompany()
            {
                Company_Id = (int)x.Element(nsA + "Company_Id"),
                Last_Modify_Date = (DateTime)x.Element(nsA + "Last_Modify_Date"),
                Company_Type_Enum = (string)x.Element(nsA + "Company_Type_Enum")
            })
            .OrderBy(x => x.Company_Type_Enum).ThenBy(x => x.Company_Id)
            .GroupBy(x => x.Company_Type_Enum, y => y)
            .ToDictionary(x => x.Key, y => y.ToList());
        }

        public static void Display()
        {
            foreach (KeyValuePair<string, List<DTOCtrmSetupCompany>> company in companies)
            {
                Console.WriteLine(company.Key);
                foreach (DTOCtrmSetupCompany companyID in company.Value)
                {
                    Console.WriteLine("{0}ID = {1,6}\tDate = {2}", new string(' ', 5), companyID.Company_Id.ToString(), companyID.Last_Modify_Date.ToShortDateString());
                }
            }
        }
    }


}