C# 从XML获取最顶层的父级

C# 从XML获取最顶层的父级,c#,xml,xpath,linq-to-xml,C#,Xml,Xpath,Linq To 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

如何从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;

詹姆斯
123
违约

我希望有一个var等于所需的结果,正如@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);
}

正如@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);
}
可以使用从父XML元素链向上遍历到根元素。然后给出根元素:

var root = element.AncestorsAndSelf().Last();
如果
XElement
包含在某些
XDocument
中,则始终可以这样做

var root = element.Document.Root;
但是在您的例子中,您可以直接解析到
XElement
,而不用费心创建
XDocument
容器。

您可以使用它沿着父XML元素链向上走到根元素。然后给出根元素:

var root = element.AncestorsAndSelf().Last();
如果
XElement
包含在某些
XDocument
中,则始终可以这样做

var root = element.Document.Root;

但是在您的例子中,您可以直接解析到
XElement
,而不用费心创建
XDocument
容器。

在XML数据模型中,开始标记(包括所有属性)、标记内容和结束标记是单个XML元素对象,因此只请求开始标记是不自然的。我不知道在.NET中有bult函数可以实现这一点,但您可以通过组合标记名和所有属性名-值对的信息来重建开始标记字符串,例如:

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);

在XML数据模型中,开始标记(包括所有属性)、标记内容和结束标记是单个XML元素对象,因此仅请求开始标记是不自然的。我不知道在.NET中有bult函数可以实现这一点,但您可以通过组合标记名和所有属性名-值对的信息来重建开始标记字符串,例如:

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);

如果我理解正确的话,在你的代码
str
中已经引用了“最顶端的父元素”即根元素。如果不是您真正想要的根元素,则发布预期输出。如果我正确理解问题,则在您的代码
str
中已经引用了“最顶端的父元素”即根元素。如果期望的输出不是您实际想要的根元素,则发布该输出。使用
XmlReader
的内置.NET方法遍历XML树标记以获取标记、属性以获取属性等。但我怀疑这里是否需要它,除非您知道自己在做什么并且需要它,否则最好不要使用这种低级API。使用
XmlReader
的内置.NET方法遍历XML树标记以获取标记、属性以获取属性等。但是我怀疑它在这里是必需的,除非你知道你在做什么并且你的需求需要它,否则你最好不要使用它。你可能是指循环体中的
属性。Name
属性。Value
?你可能是指循环体中的
属性。Name
属性。Value