使用Linq解析XML同胞节点- c#



我有一个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元素。

下面是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("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的东西,但这只允许我选择elementsafterselfelementsbeforeself。我不知道如何访问子元素。

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

您的查询中缺少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");

XPath将是我的方法:

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

应该这样做,我意识到这与你所展示的非常相似。我将首先仔细检查xdoc是你认为的。

相关内容

  • 没有找到相关文章

最新更新