如何通过给出节点id来读取xml中的节点值

时间:2011-05-05 12:30:10

标签: c# .net xml

<GlobalNavigation>
<primarylink>
<secondarylink>
    <linkid>1</linkid>
    <linkName>3</linkname>
    <secondary>
        <leftnav>
            <linkid>left1</linkid>
            <linkName>linktext</linkname>
        </leftnav>
    </secondary>
</secondarylink>
</GlobalNavigation>

我想通过给出linkid来读取leftnav linkname。

3 个答案:

答案 0 :(得分:6)

最简单的方法是使用LINQ to XML:

var doc = XDocument.Load(...);

string linkId = "left1";
var linkName = doc.Descendants("leftnav")
                  .Elements("linkid")
                  .Where(x => x.Value == linkId)
                  .Single()
                  .Parent.Element("linkName").Value;

换句话说:

  • 查看每个leftnav元素
  • 查看其下的每个linkid元素
  • 找到具有所需值的linkid元素
  • 应该只有其中一个(你可能希望在这里使用其他选项,这将改变解决方案的其余部分)。选择一个linkid元素。
  • 选择父元素
  • 找到其下的第一个linkName元素
  • 提取值(即其中的文本)

答案 1 :(得分:1)

您可以使用xpath进行搜索。 由于xpath中的字符串连接,此解决方案易受注入攻击。

XElement source = ...

var linkId = "left1";

var linkName =
    source.XPathSelectElements(@"leftnav[linkid='" + linkId + @"']/linkName")
        .Select(i=>i.Value).SingleOrDefault();

我建议使用以下内容:

var linkId = "left1";
var query =
 from leftNavElement in source.Descendants("leftnav")
 from linkIdElement in leftNavElement.Elements("linkid")
 where linkIdElement.Value == linkId
 from linkNameElement in leftNavElement.Elements("linkName")
 select linkNameElement.Value;

var linkName = query.SingleOrDefault();

它使用linq并处理没有找到匹配元素的情况。

如果两个解决方案都没有匹配,则linkName的值将为null。

答案 2 :(得分:1)

更简单的方法是使用XPathing。 http://msdn.microsoft.com/en-us/library/ms256086%28VS.85%29.aspx

关于xpathing的好处是它可以在.net 2.0中运行,你可以在一行中得到你想要的东西!...

xmlDoc.SelectSingleNode("secondaryLink/secondary/link[/linkid="123"]/linkname")