C# xml reader, 相同的元素名称
C# xml reader, same element name
我正在尝试从我的 xml 文件中读取一个元素。
我需要读取 "metadata" 内 "link" 元素中的字符串,
但是有 2 个元素叫做 "link",我只需要第二个:
<metadata>
<name>visit-2015-02-18.gpx</name>
<desc>February 18, 2015. Corn</desc>
<author>
<name>text</name>
<link href="http://snow.traceup.com/me?id=397760"/>
</author>
<link href="http://snow.traceup.com/stats/u?uId=397760&vId=1196854"/>
<keywords>Trace, text</keywords>
我需要阅读这一行:
<link href="http://snow.traceup.com/stats/u?uId=397760&vId=1196854"/>
这是第一个 "link" 标签的工作代码,它工作正常,
public string GetID(string path)
{
string id = "";
XmlReader reader = XmlReader.Create(path);
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
{
if (reader.HasAttributes)
{
id = reader.GetAttribute("href");
MessageBox.Show(id + "= first id");
return id;
//id = reader.ReadElementContentAsString();
}
}
}
return id;
}
有谁知道如何跳过第一个 "link" 元素?
或者检查 reader.ReadElementContentAsString() 是否包含 "Vid" 或类似的东西?
希望你能帮帮我。
xpath 就是答案:)
XmlReader reader = XmlReader.Create(path);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNodeList nodes = doc.SelectNodes("metadata/link");
foreach(XmlNode node in nodes)
Console.WriteLine(node.Attributes["href"].Value);
使用 String.Contains method 检查字符串是否包含所需的子字符串,在本例中为 vId
:
public string GetID(string path)
{
XmlReader reader = XmlReader.Create(path);
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
{
if (reader.HasAttributes)
{
var id = reader.GetAttribute("href");
if (id.Contains(@"&vId"))
{
MessageBox.Show(id + "= correct id");
return id;
}
}
}
return String.Empty;
}
如果可以的话你也可以使用LINQ2XML:
var reader = XDocument.Load(path); // or XDocument.Parse(path);
// take the outer link
Console.WriteLine(reader.Root.Element("link").Attribute("href").Value);
输出总是:
http://snow.traceup.com/stats/u?uId=397760&vId=1196854= first id
另一种选择是像@user5507337 建议的那样使用 XPath。
X文档示例:
var xml = XDocument.Load(path); //assuming path points to file
var nodes = xml.Root.Elements("link");
foreach(var node in nodes)
{
var href = node.Attribute("href").Value;
}
我正在尝试从我的 xml 文件中读取一个元素。 我需要读取 "metadata" 内 "link" 元素中的字符串, 但是有 2 个元素叫做 "link",我只需要第二个:
<metadata>
<name>visit-2015-02-18.gpx</name>
<desc>February 18, 2015. Corn</desc>
<author>
<name>text</name>
<link href="http://snow.traceup.com/me?id=397760"/>
</author>
<link href="http://snow.traceup.com/stats/u?uId=397760&vId=1196854"/>
<keywords>Trace, text</keywords>
我需要阅读这一行:
<link href="http://snow.traceup.com/stats/u?uId=397760&vId=1196854"/>
这是第一个 "link" 标签的工作代码,它工作正常,
public string GetID(string path)
{
string id = "";
XmlReader reader = XmlReader.Create(path);
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
{
if (reader.HasAttributes)
{
id = reader.GetAttribute("href");
MessageBox.Show(id + "= first id");
return id;
//id = reader.ReadElementContentAsString();
}
}
}
return id;
}
有谁知道如何跳过第一个 "link" 元素? 或者检查 reader.ReadElementContentAsString() 是否包含 "Vid" 或类似的东西?
希望你能帮帮我。
xpath 就是答案:)
XmlReader reader = XmlReader.Create(path);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
XmlNodeList nodes = doc.SelectNodes("metadata/link");
foreach(XmlNode node in nodes)
Console.WriteLine(node.Attributes["href"].Value);
使用 String.Contains method 检查字符串是否包含所需的子字符串,在本例中为 vId
:
public string GetID(string path)
{
XmlReader reader = XmlReader.Create(path);
while (reader.Read())
{
if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "link"))
{
if (reader.HasAttributes)
{
var id = reader.GetAttribute("href");
if (id.Contains(@"&vId"))
{
MessageBox.Show(id + "= correct id");
return id;
}
}
}
return String.Empty;
}
如果可以的话你也可以使用LINQ2XML:
var reader = XDocument.Load(path); // or XDocument.Parse(path);
// take the outer link
Console.WriteLine(reader.Root.Element("link").Attribute("href").Value);
输出总是:
http://snow.traceup.com/stats/u?uId=397760&vId=1196854= first id
另一种选择是像@user5507337 建议的那样使用 XPath。
X文档示例:
var xml = XDocument.Load(path); //assuming path points to file
var nodes = xml.Root.Elements("link");
foreach(var node in nodes)
{
var href = node.Attribute("href").Value;
}