我有一个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来获取值。我需要做的是检查每个WT
元素的ID
,如果它是我想要的,然后抓住Value
元素。
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("nnnVal 1 = {0}nnn", val1);
val1 = (string)xdoc.XPathSelectElement("//WTs/WT[ID='ID_1']/Value");
Console.WriteLine("nnnVal1 = {0}nnn", val1);
当我调试时,val1变量被设置为null。我认为问题可能是标签节点是根元素的子元素和所有其他节点的父节点。我尝试使用像xdoc.Root.FirstNode
的东西,但这只允许我选择elementsafterself
和elementsbeforeself
。我不知道如何访问子元素。
如何根据ID节点的值抓取Value节点?
您的查询中缺少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");
XPath将是我的方法:
/Root/Tags/WTs/WT[ID = TargetValue]/Value
应该这样做,我意识到这与你所展示的非常相似。我将首先仔细检查xdoc
是你认为的。