Как запросить 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;
Ответы
Ответ 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;