2016-08-30 9 views
1

У меня есть следующие XDocument:Разбор XDocument

<ExtensionInfo> 
    <ObjectExtension /> 
    <AttributeExtension> 
    <Attribute Name="PV" ExtensionType="inputoutputextension" InheritedFromTagName="$CT_STQ_V2" /> 
    <Attribute Name="PV" ExtensionType="logdatachangeeventextension" InheritedFromTagName="$CT_STQ_V2" /> 
    <Attribute Name="STS" ExtensionType="inputoutputextension" InheritedFromTagName="$CT_STQ_V2" /> 
    <Attribute Name="STS" ExtensionType="booleanextension" InheritedFromTagName="$CT_STQ_V2" /> 
    <Attribute Name="STS" ExtensionType="alarmextension" InheritedFromTagName="$CT_STQ_V2" /> 
    <Attribute Name="STS" ExtensionType="logdatachangeeventextension" InheritedFromTagName="$CT_STQ_V2" /> 
    </AttributeExtension> 
</ExtensionInfo> 

Я пытаюсь вернуть $ CT_STQ_V2 тогда и только тогда, когда атрибут Name = "СТС" и ExtensionType = "alarmextension"

Как я могу используйте XDocument & Запрос LINQ, чтобы получить то, что мне нужно. Мне нужно разобрать тысячи XML-файлов, поэтому потребуется высокая производительность. Любые предложения помогут.

спасибо.

+2

что у вас до сих пор? –

+0

Просмотрите блог [this] (https://www.intertech.com/Blog/query-an-xml-document-using-linq-to-xml/) и обновите свой вопрос, чтобы показать свои усилия. –

+0

var q1 = from elm in xd.Descendants ("Attribute") где (string) elm.Attribute ("Name") == myObjectReader ["AttributeName"]. ToString() где (string) elm.Attribute (" ExtensionType ") ==" alarmextension " select elm; foreach (var elm in q1) { inherited = (string) elm.Attribute ("InheritedFromTagName"); } – MaverickTM

ответ

1

Вы можете достичь этого с помощью простых Linq до Xml заявлений, мой предпочтительный вариант, имеющий дело с большими Xml s.

XDocument doc = XDocument.Load(filename); 

    var element = doc 
     .Descendants("AttributeExtension") // flatten the structure and look for extensions. 
     .Elements("Attribute")    // get all attribute elements 
     .FirstOrDefault(x=>(string)x.Attribute("Name") == "STS" && (string)x.Attribute("ExtensionType") == "alarmextension"); 

    if(element!= null) 
    { 
     // return attribute value. 
     return (string)element.Attribute("InheritedFromTagName"); 
    } 

Проверить это Demo