使用Linq解析XML兄弟节点 - C#

时间:2014-03-26 11:48:26

标签: c# xml linq xpath linq-to-xml

我有一个while循环,一次读取一行平面文件并解析出信息,然后将其添加到XML文件中。 必须通过调用Web服务来转换某些信息,并且我无法从响应XML中提取所需的值。

以下是我需要从以下内容中获取值的XML:

<?xml version="1.0"?>
<Root>
    <Tags>
        <WTs>
            <WT>
                <ID>ID_1</ID>
                <Value>Value 1</Value>
            </WT>
            <WT>
                <ID>ID_2</ID>
                <Value>Value 2</Value>
            </WT>
            <WT>
                <ID>ID_3</ID>
                <Value>Value 3</Value>
            </WT>
        </WTs>
    </Tags>
</Root>

我尝试使用Linq和xpath来获取值。 我需要检查每个ID元素的WT,如果它是我想要的那个,那么抓住Value元素。

这是C#代码:

var xdoc = XDocument.Parse(retValue);
string val1 = xdoc.Root.Elements("WTs")
      .Where(q => (string)q.Element("ID") == "ID_1")
      .Select(q => (string)q.Element("Value"))
      .FirstOrDefault();
Console.WriteLine("\n\n\nVal 1 = {0}\n\n\n", val1);

val1 = (string)xdoc.XPathSelectElement("//WTs/WT[ID='ID_1']/Value");
Console.WriteLine("\n\n\nVal1 = {0}\n\n\n", val1);

调试时,val1变量设置为null。我认为问题可能在于Tags节点是Root元素的子节点,而是所有其他节点的父节点。我尝试使用xdoc.Root.FirstNode之类的内容,但这只允许我选择elementsafterselfelementsbeforeself。我不知道如何访问子元素。

如何根据ID节点的值获取Value节点?

2 个答案:

答案 0 :(得分:2)

您的查询中缺少TagsWT个元素:

string val1 = xdoc.Root.Element("Tags").Element("WTs").Elements("WT")
                  .Where(q => (string)q.Element("ID") == "ID_1")
                  .Select(q => (string)q.Element("Value"))
                  .FirstOrDefault();

或者只是寻找下降

string val1 = xdoc.Root.Descendants("WT")
                  .Where(wt => (string)wt.Element("ID") == "ID_1")
                  .Select(wt => (string)wt.Element("Value"))
                  .FirstOrDefault();

XPath解决方案看起来像

string val1 = (string)xdoc.XPathSelectElement("//WT[ID='ID_1']/Value");

答案 1 :(得分:1)

XPath将是我的方法:

/Root/Tags/WTs/WT[ID = TargetValue]/Value

应该这样做,我意识到这与你所展示的非常相似。我会从双重检查开始xdoc是你认为的。