我正在使用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的列表中。
答案 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());
}
}
}
}
}