从XML获得最多的父母

时间:2015-10-14 00:51:58

标签: 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.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">的var作为期望的结果

3 个答案:

答案 0 :(得分:2)

您可以使用XElement.AncestorsAndSelf()将父XML元素链向上移动到根元素。 Enumerable.Last然后给你根元素:

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

如果某些var root = element.AncestorsAndSelf().Last(); 包含XElement,您可以随时

XDocument

但在您的情况下,您直接解析为var root = element.Document.Root; 而无需创建XElement容器。

答案 1 :(得分:2)

在XML数据模型中,开始标记(包括所有属性),标记内容和结束标记是单个XML元素对象,因此仅请求开始标记是不自然的。我不知道有一个bult-in .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);

<强> Dotnetfiddle Demo

输出

<FILE NAME="ABC" version="14.0.0.112" State="WIP" Template="ABC123" origin="designer">

答案 2 :(得分:0)

正如@ har07已经说过的那样,str是最重要的元素。如果你想让属性迭代它们

A1B2C3