如何在使用匿名类型时获取第二个或第三个XML节点?

时间:2014-11-11 21:51:15

标签: c# xml linq

我使用匿名类型来获取一些XML数据。一切顺利,直到我遇到一个XML部分,其中可能有2或3个类似的节点。与下面的XML示例一样,有3个单独的" Phones"。我的代码工作正常时,只有一个元素可以在遵循"元素路径"我带领它。我怎么能抓住一个特定的?或者所有3个问题?处理XML对我来说仍然是新的,并且似乎有很多处理它的方法在网上搜索我的确切需求并没有证明是成功的。感谢。

var nodes = from node in doc.Elements("ClaimsSvcRs").Elements("ClaimDownloadRs")
            select new
                {
                    Phone1 = (string)node.Elements("Communications").Elements("PhoneInfo").Elements("PhoneNumber").FirstOrDefault(),
                    Phone2 = (string)node.Elements("Communications").Elements("PhoneInfo").Elements("PhoneNumber").FirstOrDefault(),
                };

XML代码

<?xml version="1.0" encoding="UTF-8"?>
<TEST>
   <ClaimsSvcRs>
      <ClaimDownloadRs>
          <Communications>
             <PhoneInfo>
                <PhoneTypeCd>Phone</PhoneTypeCd>
                <CommunicationUseCd>Home</CommunicationUseCd>
                <PhoneNumber>+1-715-5553944</PhoneNumber>
             </PhoneInfo>
             <PhoneInfo>
                <PhoneTypeCd>Phone</PhoneTypeCd>
                <CommunicationUseCd>Business</CommunicationUseCd>
                <PhoneNumber>+1-715-5552519</PhoneNumber>
             </PhoneInfo>
             <PhoneInfo>
                <PhoneTypeCd>Phone</PhoneTypeCd>
                <CommunicationUseCd>Cell</CommunicationUseCd>
                <PhoneNumber>+1-715-5551212</PhoneNumber>
             </PhoneInfo>
          </Communications>
     </ClaimDownloadRs>
   </ClaimsSvcRs>
</TEST>

2 个答案:

答案 0 :(得分:1)

  

我有一段时间没有使用xpath所以我会让其他人站在那里......但是有一种方法可以根据子元素选择一个特定的PhoneInfo对象。因此,如果您知道自己是想要Home还是Business或Cell等,那么您就可以选择特定的PhoneInfo对象。否则,如果你想要简单的Phone1,2,3和null,那么使用Skip linq函数。 Phone2 = query.Skip(1).FirstOrDefault()

不用担心;)xpath可以在这里混合,是我的想法,如果您的CommunicationUseCd字段是确定性的,可能会更优雅。然后你可以有Home = ...和Work = ...等,而不是Phone1&amp;电话2

通过将where子句滑入每个查询行

,可以实现同样的目的

答案 1 :(得分:0)

如果您正在使用LINQ,您可以一次性获取所有元素:

foreach(XElement phone in XDocument.Parse(xmlString).Descendants("PhoneInfo"))
{
    Console.WriteLine(phone.Element("PhoneNumber").Value);
    //etc
}

我找到了XDocument&amp; LINQ比XmlDocument&amp; XPath,如果您对替代方案没有问题。关于他们的更多信息here