在XDocument中搜索特定节点值

时间:2015-09-16 11:28:29

标签: c# xml vb.net linq linq-to-xml

随着我的XML变得越来越大。我试图找到更快地搜索我的XML的方法。我已经阅读过关于这个XDocument的比较,这比XMLDocument快得多,但我不知道这是否属实,因为我不熟悉XML.Linq语法。

这是我的示例XML。

<?xml version="1.0" encoding="utf-8"?>
<Application>
    <Library>
        <Track>
            <TrackID>1</TrackID>
            <Name>Sample</Name>
            <Artist>ArtistName</Artist>
            <Location>C:\Users\User\Music\01 File.m4a</Location>
        </Track>
        ...
    <Library>
</Application>

这就是我在XML中搜索特定TrackID的方式。

Dim nodeList As XmlNodeList = Document.SelectNodes("/iTunesCrimson/Library/Track"), trackID As Integer = 0
            For Each n As XmlNode In nodeList
                If Not track.Location = "" AndAlso n.SelectSingleNode("Location").InnerText = track.Location Then
                    trackID = Integer.Parse(n.SelectSingleNode("TrackID").InnerText)
                    Exit For
                End If
            Next
        Return trackID

这就是我改变特定节点值的方法。

Document.SelectSingleNode("/Application/Library/Track[TrackID=" & TrackID & "]/Name").InnerText = "Sample Value"

我很难弄清楚Linq语法是如何工作的,因为我很难学习XMLDocument。有人可以帮助我将这些函数转换为XDocument的Linq,因为我现在还不熟悉它。

我的示例代码在VB.Net中,但C#会这样做。

我在这里看到了这个,但我试过但是给了我一个NullReferenceException

string id = "123"; // id to be selected

XElement Contact = (from xml2 in XMLDoc.Descendants("Node")
                    where xml2.Element("ID").Value == id
                    select xml2).FirstOrDefault();

Console.WriteLine(Contact.ToString());

1 个答案:

答案 0 :(得分:1)

如果要搜索包含某些特定TrackId的Track节点,可以使用以下命令: -

var result = xdoc.Descendants("Track")
                             .FirstOrDefault(x => (string)x.Element("TrackID") == id);

此处,xdoc是XDocument对象:XDocument xdoc = XDocument.Load(YourXMLFile);

如果您要查找并更新TrackID,可以这样做: -

xdoc.Descendants("Track").FirstOrDefault(x => (string)x.Element("TrackID") == id)
                         .SetElementValue("TrackID", "2");

最后保存您的XML: -

xdoc.Save(YourXMLfile);