使用Linq解析XML同级节点-C#

使用Linq解析XML同级节点-C#,c#,xml,linq,xpath,linq-to-xml,C#,Xml,Linq,Xpath,Linq To Xml,我有一个while循环,它一次读取一行平面文件,解析出信息,然后将其添加到XML文件中。 有些信息必须通过调用web服务进行转换,我很难从响应XML中提取所需的值 以下是我需要从中获取值的XML: <?xml version="1.0"?> <Root> <Tags> <WTs> <WT> <ID>ID_1</ID>

我有一个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>
调试时,val1变量设置为null。我认为问题可能在于Tags节点是根元素的子节点,也是所有其他节点的父节点。我尝试使用类似于
xdoc.Root.FirstNode的东西,但这只允许我选择
elementsafterself
elementsbeforeself
。我不知道如何访问children元素


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

查询中缺少
标记和
WT
元素:

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");

XPath将是我的方法:

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

如果你能做到,我意识到这与你展示的非常相似。首先,我会仔细检查xdoc是否符合您的想法。

我尝试了这三种解决方案,但仍然得到空值。如何测试xdoc是否正确?我在调试器手表中查看它,XML看起来很好。我还可以做些什么来检查xdoc是否正确?@RXC确保真正的xml具有与您发布的完全相同的结构,并且没有声明名称空间。刚刚验证的解决方案-所有示例xml都返回
值1
。注意-您可以使用
Console.WriteLine(xdoc)
验证文档中加载的内容,这就是我的问题所在。XML在
根节点
标记
节点中定义了名称空间。有什么简单的方法可以删除它们或将它们添加到查询中吗?@RXC使用linq query,您可以获得root
var ns=xdoc.root.GetDefaultNamespace()的默认名称空间
然后使用它提供元素的全名。例如,子体(ns+“WT”)
。使用xpath查询时,名称空间的使用将不会那么简单
/Root/Tags/WTs/WT[ID = TargetValue]/Value