在 XDocument 中搜索特定节点值
Search specific node value in XDocument
随着我的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 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());
如果你想搜索包含特定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);
随着我的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 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());
如果你想搜索包含特定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);