读取 xmlnode 子标签值
Reading xmlnode child tag value
我的 xml 文件如下所示。
<mappings>
<mapping>
<a>a1value</a>
<b>
<c>
<d>d1value</d>
<e>e1value</e>
</c>
</b>
</mapping>
<mapping>
<a>a2value</a>
<b>
<c>
<d>d2value</d>
<e>e2value</e>
</c>
</b>
</mapping>
</mappings>
用于读取 a、d 标签值的 C# 代码。
XmlDocument xmlDocNew = new XmlDocument();
XmlElement CATLOG = xmlDocNew.CreateElement("mappings");
XmlNode xmlNodeTab = xmltest.DocumentElement;
XmlNodeList xmlNodeListCD = xmlNodeTab.SelectNodes("//mapping");
foreach (XmlNode xmlNodeCD in xmlNodeListCD)
{
string innerText = xmlNodeCD["a"].InnerText;
string xmlNodeapp = xmlNodeCD["//b/c/d"].InnerText;
}
使用上面的代码,我可以遍历所有 "a" 标签元素。
但我无法读取 "d" 标签值。
如何读取 "d" 标签的值?
当我遍历foreach
循环中的每个元素时,我想得到"a"标签的值及其对应的"d"标签值。
此代码查看每个映射并在其下查找标签 a
和 d
的值。另请注意,如果您想查找 'sub' 标签并且只获取这些子项,则必须使用 .//
而不是 //
。点符号将节点 "under" 拉到当前节点。
XmlDocument doc = new XmlDocument();
doc.Load($@"{Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName}\json.txt");
var nodes = doc.SelectNodes("//mapping");
foreach (XmlNode node in nodes)
{
var aNodes = node.SelectNodes(".//a");
foreach (XmlNode aNode in aNodes)
Console.WriteLine(aNode.InnerText);
// If you know there will only be one node at .//b/c/d, use SelectSingleNode instead.
Console.WriteLine(node.SelectSingleNode(".//b/c/d").InnerText);
}
输出
a1value
d1value
a2value
d2value
注:
a
标签是 d
标签的兄弟姐妹,它们的单一父元素是 mapping
元素。如果您获得所有映射节点然后处理这些节点,您将获得最佳结果。
自 .Net 3.5 以来,有 Linq 和 Linq To XML,这使得 XML 解析更容易。使用 Linq To XML,您可以将其读作:
void Main()
{
var s = @"<mappings>
<mapping>
<a>a1value</a>
<b>
<c>
<d>d1value</d>
<e>e1value</e>
</c>
</b>
</mapping>
<mapping>
<a>a2value</a>
<b>
<c>
<d>d2value</d>
<e>e2value</e>
</c>
</b>
</mapping>
</mappings>";
var data = from x in XDocument.Parse(s).Descendants("mapping")
select new {
a=(string)x.Element("a"),
d=(string)x.Element("b").Element("c").Element("d")
};
foreach (var e in data)
{
Console.WriteLine($"{e.a}, {e.d}");
}
}
对于文件,而不是 .Parse
,您将使用 .Load( filename )
。
输出:
a1value, d1value
a2value, d2value
如果你有一个 class 匹配这个结构,比如:
public class MyData
{
public string A { get; set; }
public string D { get; set; }
}
然后您可以像这样使用 class 而不是匿名类型:
var data = from x in XDocument.Parse(s).Descendants("mapping")
select new MyData {
A=(string)x.Element("a"),
D=(string)x.Element("b").Element("c").Element("d")
};
foreach (var e in data)
{
Console.WriteLine($"{e.A}, {e.D}");
}
PS:由于您获得的是 IEnumerable,因此您可以直接将数据绑定到 DataGridView, ListBox ... ( ...DataSource = data.ToList())
。
我的 xml 文件如下所示。
<mappings>
<mapping>
<a>a1value</a>
<b>
<c>
<d>d1value</d>
<e>e1value</e>
</c>
</b>
</mapping>
<mapping>
<a>a2value</a>
<b>
<c>
<d>d2value</d>
<e>e2value</e>
</c>
</b>
</mapping>
</mappings>
用于读取 a、d 标签值的 C# 代码。
XmlDocument xmlDocNew = new XmlDocument();
XmlElement CATLOG = xmlDocNew.CreateElement("mappings");
XmlNode xmlNodeTab = xmltest.DocumentElement;
XmlNodeList xmlNodeListCD = xmlNodeTab.SelectNodes("//mapping");
foreach (XmlNode xmlNodeCD in xmlNodeListCD)
{
string innerText = xmlNodeCD["a"].InnerText;
string xmlNodeapp = xmlNodeCD["//b/c/d"].InnerText;
}
使用上面的代码,我可以遍历所有 "a" 标签元素。 但我无法读取 "d" 标签值。 如何读取 "d" 标签的值?
当我遍历foreach
循环中的每个元素时,我想得到"a"标签的值及其对应的"d"标签值。
此代码查看每个映射并在其下查找标签 a
和 d
的值。另请注意,如果您想查找 'sub' 标签并且只获取这些子项,则必须使用 .//
而不是 //
。点符号将节点 "under" 拉到当前节点。
XmlDocument doc = new XmlDocument();
doc.Load($@"{Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName}\json.txt");
var nodes = doc.SelectNodes("//mapping");
foreach (XmlNode node in nodes)
{
var aNodes = node.SelectNodes(".//a");
foreach (XmlNode aNode in aNodes)
Console.WriteLine(aNode.InnerText);
// If you know there will only be one node at .//b/c/d, use SelectSingleNode instead.
Console.WriteLine(node.SelectSingleNode(".//b/c/d").InnerText);
}
输出
a1value
d1value
a2value
d2value
注:
a
标签是 d
标签的兄弟姐妹,它们的单一父元素是 mapping
元素。如果您获得所有映射节点然后处理这些节点,您将获得最佳结果。
自 .Net 3.5 以来,有 Linq 和 Linq To XML,这使得 XML 解析更容易。使用 Linq To XML,您可以将其读作:
void Main()
{
var s = @"<mappings>
<mapping>
<a>a1value</a>
<b>
<c>
<d>d1value</d>
<e>e1value</e>
</c>
</b>
</mapping>
<mapping>
<a>a2value</a>
<b>
<c>
<d>d2value</d>
<e>e2value</e>
</c>
</b>
</mapping>
</mappings>";
var data = from x in XDocument.Parse(s).Descendants("mapping")
select new {
a=(string)x.Element("a"),
d=(string)x.Element("b").Element("c").Element("d")
};
foreach (var e in data)
{
Console.WriteLine($"{e.a}, {e.d}");
}
}
对于文件,而不是 .Parse
,您将使用 .Load( filename )
。
输出:
a1value, d1value
a2value, d2value
如果你有一个 class 匹配这个结构,比如:
public class MyData
{
public string A { get; set; }
public string D { get; set; }
}
然后您可以像这样使用 class 而不是匿名类型:
var data = from x in XDocument.Parse(s).Descendants("mapping")
select new MyData {
A=(string)x.Element("a"),
D=(string)x.Element("b").Element("c").Element("d")
};
foreach (var e in data)
{
Console.WriteLine($"{e.A}, {e.D}");
}
PS:由于您获得的是 IEnumerable,因此您可以直接将数据绑定到 DataGridView, ListBox ... ( ...DataSource = data.ToList())
。