解析xml响应 - 根据另一个节点的值选择特定节点

时间:2015-12-22 19:57:47

标签: c# xml xml-parsing xmlhttprequest httpresponse

我是xml的新手,所以我不确定我是否正确地提出了这个问题,但我会尽力解释。

基本上,我试图在C#中解析xml响应,如下所示:

<Premium>
        <TotalPremiumAmount>87</TotalPremiumAmount>
        <StandardPremium>87</StandardPremium>
        <OptionalPremium>0</OptionalPremium>
        <StandardTax>0</StandardTax>
        <OptionalTax>0</OptionalTax>
        <ExtendedTax>0</ExtendedTax>
        <ExtendedPremium>0</ExtendedPremium>
        <PromotionalPremium>0</PromotionalPremium>
        <FeesPremium>0</FeesPremium>
        <FeesTax>0</FeesTax>
        <StandardFeesPremium>0</StandardFeesPremium>
        <OptionalFeesPremium>0</OptionalFeesPremium>
        <Tax>0</Tax>
        <StandardPremiumDistribution>
            <Travelers>
                <Traveler>
                    <TravelerPremium>42</TravelerPremium>
                    <TravelerTax>0</TravelerTax>
                </Traveler>
                <Traveler>
                    <TravelerPremium>45</TravelerPremium>
                    <TravelerTax>0</TravelerTax>
                </Traveler>
            </Travelers>
        </StandardPremiumDistribution>
        <PackagePremiumDistribution>
            <Packages>
                <Package>
                    <PackageID>20265</PackageID>
                    <PackageName />
                    <PackageTypeID>12</PackageTypeID>
                    <Premium>87</Premium>
                    <Fees>0</Fees>
                    <Tax>0</Tax>
                    <Travelers>
                        <Traveler>
                            <TravelerID>0</TravelerID>
                            <Premium>42</Premium>
                            <Tax>0</Tax>
                        </Traveler>
                        <Traveler>
                            <TravelerID>1</TravelerID>
                            <Premium>45</Premium>
                            <Tax>0</Tax>
                        </Traveler>
                    </Travelers>
                </Package>
            </Packages>
        </PackagePremiumDistribution>
    </Premium>

我想获得(Traveler)Premium的价值。在只有一个旅行者的情况下,我一直在使用XMLDocument和&#39; SelectSingleNode&#34;功能。例如,我可以做类似的事情:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlResponse);
var premium = xmlDoc.SelectSingleNode("//TravelerPremium").InnerText;

但是,当多个旅行者在一个计划下返回时,这不会起作用。例如,当TravelerID = 0时,我需要溢价。我将如何进行此操作?

感谢。

3 个答案:

答案 0 :(得分:1)

使用XmlDocument:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlResponse);
var premium = xmlDoc.SelectSingleNode("//Premium[../TravelerID = '0']")

如果多个可以在这种条件下匹配,你也可以遍历节点:

foreach(var premium in xmldoc.SelectNodes("//Premium[../TravelerID = '0']")
{
   // do work on each premium node where TravelerID = 0
}

我鼓励您考虑使用LINQ to XML - 它通常更容易使用,并且在大多数情况下性能更高。您甚至可以使用XPath表达式,但以下方法可以使用:

XDocument xdoc = XDocument.Load(xmlResponse);
var premium = (string)xdoc.Descendants("Traveler").Where(x => (string)x.Element("TravelerID") == "0").Element("Premium");

答案 1 :(得分:0)

假设您的xml看起来像这样,尝试这样的事情:

XmlDocument doc = new XmlDocument();
xmlDoc.Load(xmlResponse);

if (doc.HasChildNodes)
                {
                    foreach (XmlNode node in doc.DocumentElement.ChildNodes)
                       if (node.Name == "StandardPremiumDistribution")
                        {
XmlNodeList xnList = node.SelectNodes("//Travelers");
double travelerPremium= xnList.Item(z).FirstChild.InnerText);

}}

基于此,我想你会这样做。

答案 2 :(得分:0)

假设您有一个名为XMLFile1.xml的文件,其中包含您发布的XML,您可以使用以下代码遍历所有TravelerPremium:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load("XMLFile1.xml");
    XmlNodeList premiums = xmlDoc.SelectNodes("//TravelerPremium");
    foreach(XmlNode node in premiums)
    {
        MessageBox.Show(node.FirstChild.InnerText);
    }

您还可以使用类似的代码访问其他元素。