none
Как при помощи LINQ to XML получить конкретный элемент? RRS feed

  • Вопрос

  • Подскажите пожалуйста, как при помощи LINQ to XML получить конкретный элемент по его имени? Вот укороченный пример файла:
    <SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <SOAP-ENV:Body>
            <a1:Hashtable id="ref-1" xmlns:a1="http://schemas.microsoft.com/clr/ns/System.Collections">
                <LoadFactor>0.72</LoadFactor>
                <Version>341</Version>
                <Comparer xsi:null="1"/>
                <HashCodeProvider xsi:null="1"/>
                <HashSize>919</HashSize>
                <Keys href="#ref-2"/>
                <Values href="#ref-3"/>
            </a1:Hashtable>
            <SOAP-ENC:Array id="ref-2" SOAP-ENC:arrayType="xsd:anyType[334]">
                <item id="ref-4" xsi:type="SOAP-ENC:string">txtB_TF1_B2</item>
                <item id="ref-5" xsi:type="SOAP-ENC:string">chbH1W_H2</item>
            </SOAP-ENC:Array>
            <SOAP-ENC:Array id="ref-3" SOAP-ENC:arrayType="xsd:anyType[334]">
                <item xsi:type="xsd:int">350</item>
                <item xsi:type="xsd:boolean">false</item>
            </SOAP-ENC:Array>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

    нужно получить элемент a1:Hashtable, такой файл получается при SOAP сериализации Hashtable.
    • Изменено SergejS 7 июля 2017 г. 13:14
    7 июля 2017 г. 13:12

Ответы

  • Нужно обязательно учитывать пространства имён.

    XNamespace env = "http://schemas.xmlsoap.org/soap/envelope/";
    XNamespace a1 = "http://schemas.microsoft.com/clr/ns/System.Collections";
    
    var xml = XElement.Load("test.xml");
    var hashtable = xml.Element(env + "Body").Element(a1 + "Hashtable");

    Элементы внутри hashtable пространств имён не имеют. Поэтому к ним можно обращаться без них:

    var version = hashtable.Element("Version");

    • Помечено в качестве ответа SergejS 7 июля 2017 г. 13:56
    7 июля 2017 г. 13:49

Все ответы

  • Нужно обязательно учитывать пространства имён.

    XNamespace env = "http://schemas.xmlsoap.org/soap/envelope/";
    XNamespace a1 = "http://schemas.microsoft.com/clr/ns/System.Collections";
    
    var xml = XElement.Load("test.xml");
    var hashtable = xml.Element(env + "Body").Element(a1 + "Hashtable");

    Элементы внутри hashtable пространств имён не имеют. Поэтому к ним можно обращаться без них:

    var version = hashtable.Element("Version");

    • Помечено в качестве ответа SergejS 7 июля 2017 г. 13:56
    7 июля 2017 г. 13:49
  • Спасибо сейчас попробую!
    7 июля 2017 г. 13:52