LINQ to XML - извлечение значений из вложенных пространств имен в объект - PullRequest
0 голосов
/ 05 мая 2011

Я хотел бы использовать LINQ to XML для извлечения значений из документа XML, который имеет вложенные пространства имен.

На мой вопрос частично ответил другой пользователь SO: LINQ to XML с вложенными пространствами имен

Мне все еще не удается понять, как выбрать значения в свойствах объекта.

Вот ресурсы для этой проблемы:

Пример ссылки на файл XML

Содержание ссылки выше:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:Envelope xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ns3="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4">
<ns1:Header>
    <ns3:TransactionID ns1:mustUnderstand="1">XXXX-XXXX-XXXX-XXXX</ns3:TransactionID>
</ns1:Header>
<ns1:Body>
<ns3:DeliverReq>
    <ns3:MM7Version>6.8.0</ns3:MM7Version>
    <ns3:LinkedID>LINKED-ID-IS-HERE</ns3:LinkedID>
    <ns3:Sender>
        <ns3:Number>3025551212</ns3:Number>
    </ns3:Sender>
    <ns3:Recipients>
        <ns3:To>
            <ns3:Number displayOnly="false">11111</ns3:Number>
        </ns3:To>
    </ns3:Recipients>
    <ns3:TimeStamp>2011-04-25T10:28:40.000Z</ns3:TimeStamp>
    <ns3:UACapabilities UAProf="motok1c"/>
    <ns3:Content allowAdaptations="true" href="cid:default.cid"/>
</ns3:DeliverReq>
</ns1:Body>
</ns1:Envelope>

Объект, который будет заполнен из этого XML:

public class TestClass
{
    public string TransactionId { get; set; }
    public string MessageType { get; set; }
    public string Mm7Version { get; set; }
    public string VaspId { get; set; }
    public string VasId { get; set; }
    public string Sender { get; set; }
    public string Recipients { get; set; }
    public string LinkedId { get; set; }
    public string TimeStamp { get; set; }
    public string Priority { get; set; }
    public string Subject { get; set; }
    public string Content { get; set; }
    public string UaCapabilities { get; set; }

    // not all properties appear in every XML message received
}

Пример SO помог мне понять необходимость добавления пространства имен (XNamespace), но у меня не получается, когда я пытаюсь заполнить объект с помощью оператора LINQ.

Я думаю, мне нужно сделать что-то вроде:

// (don't know the "from" in this case - decendants? 
// which XML key / node?)
select new TestClass
{
    TransactionId = [LINQ to select the "TransactionID" value that 
        appears under the Header key]
    Mm7Version = [LINQ to select the "MM7Version" value, under the 
        DeliverReq key]     
    .....
}

Какова форма LINQ, чтобы иметь возможность выбирать значения в свойствах объекта, когда у вас есть XML, как опубликовано выше? Я забочусь о данных в двух частях XML: значение TransactionID в заголовке и значения, которые находятся под DeliverReq . Странно, что они разложены, и это более запутанно, чем просто строго выбирать значения из клавиши DeliverReq . Если бы я увидел часть FROM и 2–3 свойства, заполненные значениями из XML, то я мог бы взять его оттуда.

Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения. Мои основные проблемы связаны с частью «FROM» в LINQ и с тем, как бороться с тем фактом, что TransactionId находится вне тега DeliverReq. Я думаю, что могу справиться с другими случаями, такими как вложение значений в теги Sender и Recipients.

1 Ответ

1 голос
/ 05 мая 2011

Так как в вашем XML есть только свойства для одного из ваших TestClass экземпляров, и значения для них повсюду, имеет смысл выбрать их вручную и затем создать экземпляр:

XDocument doc = XDocument.Load(@"test.xml");
XNamespace ns3 = "http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-6-MM7-1-4";

string transactionId = doc.Descendants(ns3 + "TransactionID").Single().Value;
string mm7Version = doc.Descendants(ns3 + "MM7Version").Single().Value;
//...select the other elements

TestClass testClass = new TestClass() { TransactionId = transactionId, 
                                        Mm7Version = mm7Version};
...