代码之家  ›  专栏  ›  技术社区  ›  K. Ajay

如何在解析XML后获取特定值?

  •  0
  • K. Ajay  · 技术社区  · 7 年前

    我正在用Xamarin android创建一个应用程序,这里我正在解析一个XML响应,该响应是我从一个web请求中获得的。 下面是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多人。 我想要的是让这个人 <a:Job_Title_Enum> 并将相应的人员ID分配给该人员。例如:如果Job\u Title\u 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,而不是将其打印在列表上,因为我将使此列表适应微调器。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Eser    7 年前

    使用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();