Как запросить XDocument с LINQ, когда элементы имеют двоеточие в имени? - PullRequest
20 голосов
/ 29 октября 2009

Я пытаюсь использовать 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;

Ответы [ 2 ]

40 голосов
/ 29 октября 2009

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

xmlns:serv="..."

Значением внутри кавычек будет пространство имен. Теперь в своем коде C # вы используете этот 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().

6 голосов
/ 29 октября 2009

Это двоеточие означает, что XML использует пространства имен . Основываясь на этом блоге , который кто-то писал о 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...