【问题标题】:How to get specific value after parsing an XML?解析 XML 后如何获取特定值?
【发布时间】:2018-09-15 16:12:46
【问题描述】:

我正在使用 Xamarin android 创建一个应用程序,这里我正在解析从 Web 请求获得的 XML 响应。 这是 xml 响应 -

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <IsActive xmlns="http://CTRMService/CTRM">true</IsActive>
   </s:Header>
   <s:Body>
      <GetAllPersonResponse xmlns="http://CTRMService/CTRM">
         <GetAllPersonResult xmlns:a="http://schemas.datacontract.org/2004/07/DTOModelLayer.DTO" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:DTOCtrmSetupPerson>
               <a:CTRM_SETUP_PERSON_COMPANY_LINK i:nil="true"/>
               <a:Company_Id i:nil="true"/>
               <a:Customer_Id>1</a:Customer_Id>
               <a:Email_Address i:nil="true"/>
               <a:First_Name>Admin</a:First_Name>
               <a:Invoice_Contact_Enum>false</a:Invoice_Contact_Enum>
               <a:Job_Title_Enum i:nil="true"/>
               <a:Last_Modify_Date>2017-04-24T17:12:22.657</a:Last_Modify_Date>
               <a:Last_Name>Admin</a:Last_Name>
               <a:Lock_Id>0</a:Lock_Id>
               <a:Middle_Name i:nil="true"/>
               <a:Modify_Person_Id>1</a:Modify_Person_Id>
               <a:Person_Id>1</a:Person_Id>
               <a:Person_Initials i:nil="true"/>
               <a:Status_Enum>true</a:Status_Enum>
               <a:System_Default_Enum>true</a:System_Default_Enum>
            </a:DTOCtrmSetupPerson>
            <a:DTOCtrmSetupPerson>
               <a:CTRM_SETUP_PERSON_COMPANY_LINK i:nil="true"/>
               <a:Company_Id>6</a:Company_Id>
               <a:Customer_Id>1</a:Customer_Id>
               <a:Email_Address/>
               <a:First_Name>abc</a:First_Name>
               <a:Invoice_Contact_Enum>true</a:Invoice_Contact_Enum>
               <a:Job_Title_Enum>Trader</a:Job_Title_Enum>
               <a:Last_Modify_Date>2017-04-06T10:55:41.05</a:Last_Modify_Date>
               <a:Last_Name>xyz</a:Last_Name>
               <a:Lock_Id>3</a:Lock_Id>
               <a:Middle_Name/>
               <a:Modify_Person_Id>1</a:Modify_Person_Id>
               <a:Person_Id>2</a:Person_Id>
               <a:Person_Initials>PB</a:Person_Initials>
               <a:Status_Enum>false</a:Status_Enum>
               <a:System_Default_Enum i:nil="true"/>
            </a:DTOCtrmSetupPerson>

我已经发布了那个xml的一部分,有10多人。 我想要的是根据&lt;a:Job_Title_Enum&gt; 获取该人并将相应的人ID分配给该人。例如:如果 Job_Title_Enum 是“trader”,那么名字和姓氏将被添加到一个列表中,每个人都有各自的 personID

我已经实现了一种我在网上找到的解析方法 方法:-

XmlTextReader textReader = new XmlTextReader("E:\\GetAllPersonresponse.xml");
            textReader.Read();
XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(textReader);

            XmlNodeList FirstName = xmlDoc.GetElementsByTagName("a:First_Name");
            XmlNodeList LastName = xmlDoc.GetElementsByTagName("a:Last_Name");
            XmlNodeList JobTitle = xmlDoc.GetElementsByTagName("a:Job_Title_Enum");
            XmlNodeList personID = xmlDoc.GetElementsByTagName("a:Person_Id");

            for (int i = 0; i < JobTitle.Count; i++)
            {


               if (JobTitle[i].InnerText == "Trader")
               {

                    Trader.Add(FirstName[i].InnerText + " " + LastName[i].InnerText +"(" + personID[i].InnerText+")");

               }


            }

此方法列出了“Firstname Lastname (PersonID)”,例如:- Admin Admin (1)。你能建议我一个有效的方法吗?这将分配 ID 而不是将其打印在列表上,因为我会将此列表调整为微调器。

【问题讨论】:

  • 如果您没有性能要求,我建议您使用 Xlinq。让查询 XML 变得轻而易举。
  • 能否为我的 XML 发布一个示例?
  • 实际上这看起来像一个 SOAP 服务。可以在 VS 中添加网页引用吗?它将为您自动生成 C# 类。
  • 我不得不使用这种方法,因为出于某种奇怪的原因,在将其添加为参考后,我无法创建服务对象

标签: c# xml visual-studio xml-parsing


【解决方案1】:

使用 Linq2Xml,

var xDoc = XDocument.Parse(xmlstring);
//var xDoc = XDocument.Load(filename);

XNamespace a = "http://schemas.datacontract.org/2004/07/DTOModelLayer.DTO";

var persons = xDoc.Descendants(a + "DTOCtrmSetupPerson")
                    .Select(x => new
                    {
                        firstName = (string)x.Element(a + "First_Name"),
                        personId = (int)x.Element(a + "Person_Id")
                    })
                    .ToList();

【讨论】:

  • 感谢您的及时回复。这行得通!因为这是一个列表,我想将此列表调整为我的微调器,当我从该列表中选择一个项目时,我将以这种方式选择它 - string selecteditem = spinner.getselecteditem.tostring();现在,我将如何在此处获取所选人员的 ID?
  • 如何提取所选列表元素的 personId 例如:- string selecteditem = spinner.getselecteditem.getpersonID.tostring();
  • 是的,你是对的!我只是问如何从人员列表中提取人员 ID。就是这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2012-12-30
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多