我有一个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
之类的内容,但这只允许我选择elementsafterself
和elementsbeforeself
。我不知道如何访问子元素。
如何根据ID节点的值获取Value节点?
答案 0 :(得分:2)
您的查询中缺少Tags
和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");
答案 1 :(得分:1)
XPath将是我的方法:
/Root/Tags/WTs/WT[ID = TargetValue]/Value
应该这样做,我意识到这与你所展示的非常相似。我会从双重检查开始xdoc
是你认为的。