Подтвердить что ты не робот

Как запросить XDocument с LINQ, когда у элементов есть двоеточие в их имени?

Я пытаюсь использовать LINQ to XML в объекте XDocument. Как вы запрашиваете элемент результата в приведенном ниже примере?

<serv:header>
   <serv:response>
      <serv:result>SUCCESS</serv:result>
      <serv:gsbStatus>PRIMARY</serv:gsbStatus>
   </serv:response>
</serv:header>

Когда я использую такой оператор, я получаю исключение. Дополнительная информация: символ ":", шестнадцатеричное значение 0x3A, не может быть включен в имя.

XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants("serv:header").First().Descendants("serv:response").First().Descendants("serv:result").First().Value;
4b9b3361

Ответ 1

serv в вашем XML является префиксом пространства имен. Он должен быть связан с некоторым URI, который идентифицирует пространство имен. Найдите такой атрибут в своем XML:

xmlns:serv="..."

Значение внутри кавычек будет пространством имен. Теперь, в вашем коде С#, вы используете этот URI для создания объекта XNamespace:

private static readonly XNamespace serv = "...";

И тогда вы можете использовать это в таких запросах:

string value = doc
    .Descendants(serv + "header").First()
    .Descendants(serv + "response").First()
    .Descendants(serv + "result").First()
    .Value;

Кстати, вы должны использовать .Element(), а не .Descendants().First().

Ответ 2

Этот двоеточие означает, что XML использует namespaces. Основываясь на этом blogpost, кто-то опубликовал информацию о LINQ, XML и пространствах имен, здесь приведена версия вашего кода, которую вы можете попробовать.:

static XName serv(string name)
{
  return XNamespace.Get("<THE_NAMESPACE_URL>") + name;
}

XDocument doc = XDocument.Parse(xml);
string value = doc.Descendants(serv("header")).First().Descendants(serv("response")).First().Descendants(serv("result")).First().Value;