Используйте Linq для Xml с пространствами имен Xml

У меня есть этот код:

/*string theXml =
@"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/

string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>";

XDocument xmlElements = XDocument.Parse(theXml);

var elements = from data in xmlElements.Descendants("Result")
               select new {
                            TheBool = (bool)data.Element("TheBool"),
                            TheId = (int)data.Element("TheId"),
                          };

foreach (var element in elements)
{
    Console.WriteLine(element.TheBool);
    Console.WriteLine(element.TheId);
}

Когда я использую первое значение для theXml, результат является пустым, тогда как со вторым, у меня есть хорошие значения...

Как использовать Linq для Xml со значениями xmlns?

56
задан John Saunders 3 September 2012 в 19:28
поделиться

2 ответа

Методы LINQ to XML, такие как Потомки и Элемент , принимают XName в качестве аргумента. . Преобразование из строки в XName происходит автоматически. Вы можете исправить это, добавив XNamespace перед строками в ваших вызовах Descendants и Element . Остерегайтесь, потому что у вас работают 2 разных пространства имен.


string theXml =
                @"true1";

            //string theXml = @"true1";

    XDocument xmlElements = XDocument.Parse( theXml );
    XNamespace ns = "http://myvalue.com";
    XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";
    var elements = from data in xmlElements.Descendants( ns + "Result" )
          select new
                 {
                     TheBool = (bool) data.Element( nsa + "TheBool" ),
                     TheId = (int) data.Element( nsa + "TheId" ),
                 };

    foreach ( var element in elements )
    {
        Console.WriteLine( element.TheBool );
        Console.WriteLine( element.TheId );
    }

Обратите внимание на использование ns в Descendants и nsa в Elements

88
ответ дан 26 November 2019 в 17:17
поделиться

Вы можете передать XName с пространством имен в Descendants () и ] Элемент () . Когда вы передаете строку в Descendants (), она неявно преобразуется в XName без пространства имен.

Чтобы создать XName в пространстве имен, вы создаете XNamespace и связываете его с локальным именем элемента (строкой).

XNamespace ns = "http://myvalue.com";
XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";

var elements = from data in xmlElements.Descendants( ns + "Result")
                   select new
                              {
                                  TheBool = (bool)data.Element( nsa + "TheBool"),
                                  TheId = (int)data.Element( nsa + "TheId"),
                              };

Существует также сокращенная форма для создания XName с пространством имен посредством неявного преобразования из строки.

var elements = from data in xmlElements.Descendants("{http://myvalue.com}Result")
                   select new
                              {
                                  TheBool = (bool)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheBool"),
                                  TheId = (int)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheId"),
                              };

В качестве альтернативы вы можете запросить XElement. Name.LocalName .

var elements = from data in xmlElements.Descendants()
                   where data.Name.LocalName == "Result"
26
ответ дан 26 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: