2015-10-14 1 views
0

Как получить самый главный родительский элемент из XML? Мне нужен весь элемент со своими атрибутами.Get Top Most Parent From 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"> как желаемый результат

+2

В коде 'str' уже эталонным 'самый верхний родитель' ак a корневой элемент, если я правильно понял вопрос. Вывести ожидаемый результат, если он не является корневым элементом, который вы хотите на самом деле. – har07

ответ

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"> 
+1

Встроенный метод .NET для обработки тега XML-тега для тега, атрибута для атрибута и т. д. заключается в использовании 'XmlReader'. Но я сомневаюсь, что это требуется здесь, это низкоуровневый API, от которого вам лучше держаться подальше, если вы не знаете, что делаете, и вам это нужно. – Abel

0

, как @ har07 уже сказал, ул является самым верхним элементом. Если вы хотите, атрибуты просто перебирать их

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

Возможно, вы, вероятно, имели в виду тело атрибута attribute.Name и 'attribute.Value'? – Abel

+0

упс, ты прав. исправлено –

2

Вы можете использовать XElement.AncestorsAndSelf() идти вверх по цепочке элементов родительского XML для корневого элемента. Enumerable.Last затем дает корневой элемент:

var root = element.AncestorsAndSelf().Last(); 

Если XElement содержится какой-то XDocument, вы всегда можете сделать

var root = element.Document.Root; 

Но в вашем случае, если вы разобран непосредственно к XElement, не потрудившись создать XDocument контейнер.