1

我试图在我选择的节点之后从一个节点获取一个值。到目前为止,我已经能够将整个节点信息作为 var 获取,但我被困在如何仅获取值上。

我的 xml 看起来像这样

<COLUMN>
<NAME>Addr1</NAME>
<VALUE>1234 my street</VALUE>
</COLUMN>

我得到这样的节点

var address = (from c in contactInfo.Descendants("NAME")
                                   where c.Value == "Addr1"
                               select c.NextNode).Single();

谢谢

4

4 回答 4

3

尝试:

(address as XElement).Value
于 2013-01-31T08:46:11.167 回答
1

NextNode返回一个XNode, 而你需要一个XElement:

var address = (from c in doc.Descendants("NAME")
    where c.Value == "Addr1"
    select c.NextNode).OfType<XElement>().Single().Value;

我宁愿避免将所有内容放在一行上,而是执行以下操作来添加一些额外的检查:

var address = (from c in doc.Descendants("NAME")
                where c.Value == "Addr1"
                select c.NextNode).Single();
var element = address as XElement;
if (element != null) {
    string value = element.Value;
}
于 2013-01-31T08:46:36.127 回答
1
var node = contactInfo.Descendants("COLUMN")
                  .SingleOrDefault(c => c.Element("NAME").Value.Equals("Addr1"))

if (node != null)
     var result = node.Element("VALUE").Value;
于 2013-01-31T08:46:45.197 回答
0

您应该选择COLUMN元素而不是搜索NAME元素:

var address = (from c in contactInfo.Descendants("COLUMN")
               where (string)c.Element("NAME") == "Addr1"
               select (string)c.Element("VALUE")).Single();

与方法语法相同:

var address = contactInfo.Descendants("COLUMN")
                         .Where(c => (string)c.Element("NAME") == "Addr1")
                         .Select(c => (string)c.Element("VALUE"))
                         .Single();

此外,您应该完全确定始终存在一个具有 name 的列元素Addr1。否则Single()会抛出异常。

于 2013-01-31T08:50:44.910 回答