从 XML 获取最高父级
Get Top Most Parent From XML
如何从 XML 获取最顶层的父元素?我需要整个元素及其属性。
它不会总是第一行,因为可能会有评论。
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
XElement str = XElement.Parse(xmlStr);
var h1 = str.Parent;
var h2 = str.XPathSelectElements("..").FirstOrDefault();
var h3 = str.XPathSelectElement("..").Parent;
<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">
<REC NAME="Recipient">
<FLD NAME="FirstName">James</FLD>
</REC>
<REC NAME="Message">
<FLD NAME="Key">123</FLD>
</REC>
<REC NAME="Details">
<FLD NAME="Key">default</FLD>
</REC>
</File>
我希望有一个等于 <FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">
的变量作为期望的结果
正如@har07 所说,str 是最顶层的元素。如果你想要属性只是迭代它们
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
var root = XElement.Parse(xmlStr);
foreach (var attribute in root.Attributes())
{
Console.WriteLine("{0} : {1}", attribute .Name, attribute.Value);
}
您可以使用 XElement.AncestorsAndSelf()
to walk up the chain of parent XML elements to the root element. Enumerable.Last
然后给您根元素:
var root = element.AncestorsAndSelf().Last();
如果 XElement
包含在一些 XDocument
中,你总是可以做
var root = element.Document.Root;
但在您的情况下,您直接解析为 XElement
而无需费心创建 XDocument
容器。
在XML数据模型中,开始标签(包括所有属性)、标签内容、结束标签都是单一的XML元素对象,所以只请求是不自然的开始标签。我不知道内置的 .NET 函数可以实现这一点,但您可以通过组合标签名称和所有属性名称-值对的信息来重建开始标签字符串,例如:
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
XElement str = XElement.Parse(xmlStr);
var attributes = String.Join(" ", str.Attributes().Select(o => String.Format("{0}=\"{1}\"", o.Name, o.Value)));
var result = string.Format("<{0} {1}>", str.Name, attributes);
Console.WriteLine(result);
输出:
<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">
如何从 XML 获取最顶层的父元素?我需要整个元素及其属性。
它不会总是第一行,因为可能会有评论。
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
XElement str = XElement.Parse(xmlStr);
var h1 = str.Parent;
var h2 = str.XPathSelectElements("..").FirstOrDefault();
var h3 = str.XPathSelectElement("..").Parent;
<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">
<REC NAME="Recipient">
<FLD NAME="FirstName">James</FLD>
</REC>
<REC NAME="Message">
<FLD NAME="Key">123</FLD>
</REC>
<REC NAME="Details">
<FLD NAME="Key">default</FLD>
</REC>
</File>
我希望有一个等于 <FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">
的变量作为期望的结果
正如@har07 所说,str 是最顶层的元素。如果你想要属性只是迭代它们
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
var root = XElement.Parse(xmlStr);
foreach (var attribute in root.Attributes())
{
Console.WriteLine("{0} : {1}", attribute .Name, attribute.Value);
}
您可以使用 XElement.AncestorsAndSelf()
to walk up the chain of parent XML elements to the root element. Enumerable.Last
然后给您根元素:
var root = element.AncestorsAndSelf().Last();
如果 XElement
包含在一些 XDocument
中,你总是可以做
var root = element.Document.Root;
但在您的情况下,您直接解析为 XElement
而无需费心创建 XDocument
容器。
在XML数据模型中,开始标签(包括所有属性)、标签内容、结束标签都是单一的XML元素对象,所以只请求是不自然的开始标签。我不知道内置的 .NET 函数可以实现这一点,但您可以通过组合标签名称和所有属性名称-值对的信息来重建开始标签字符串,例如:
string xmlStr = File.ReadAllText(@"C:\Users\GRPAdmin\Desktop\Test.xml");
XElement str = XElement.Parse(xmlStr);
var attributes = String.Join(" ", str.Attributes().Select(o => String.Format("{0}=\"{1}\"", o.Name, o.Value)));
var result = string.Format("<{0} {1}>", str.Name, attributes);
Console.WriteLine(result);
输出:
<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">