Символ ':', шістнадцяткове значення 0x3A, не може бути включений в ім'я


78

У мене є файл xml, який містить такий елемент, як

<ab:test>Str</ab:test>  

Коли я намагаюся отримати доступ до нього за допомогою коду:

XElement tempElement = doc.Descendants(XName.Get("ab:test")).FirstOrDefault();

Це видає мені цю помилку:

System.Web.Services.Protocols.SoapException: Сервер не зміг обробити запит. ---> System.Xml.XmlException: Символ ':', шістнадцяткове значення 0x3A, не може бути включений в ім'я.

Як мені отримати доступ до нього?


У вас, звичайно, є спосіб обробляти простори імен, тому вам не потрібно (або в цьому випадку ви не можете) вводити їх у ім'я. Вам слід заглянути в цей напрямок.
p4bl0

2
Специфікація XML не тільки говорить, що ":" дозволено для імен (і для запуску імен!), Але метод Get XName не підтверджує, що він кидає XmlException!
yoozer8

Дивіться також stackoverflow.com/questions/8324960/… щодо правильної обробки простору імен.
Polluks

Відповіді:


116

Якщо ви хочете використовувати простори імен, LINQ to XML робить це дуже просто:

XNamespace ab = "http://whatever-the-url-is";
XElement tempElement = doc.Descendants(ab + "test").FirstOrDefault();

Шукайте xmlns:ab=...розділ у своєму документі, щоб з’ясувати, до якого URI простору імен посилається.


2
Це працює, але проблема в тому, що значення xmlns: ab генерується динамічно на основі позначки часу. Як я можу отримати його значення?
coure2011,

6
@ coure06: URI простору імен динамічний? Це досить дивно. Але так, ви можете отримати його, знайшовши значення атрибута для XNamespace.Xmlns + "ab"будь-якого елемента, який його оголошує.
Джон Скіт,

Я отримую цю помилку: stackoverflow.com/questions/42839628 / ...
СІ8

Цікаво, що це, здається, не працює з новим синтаксисом $"{ab}test"
Ліам,

2
@Liam: Я би очікував, що - ab + "test"не виконує конкатенацію рядків; він використовує +(XNamespace, string)оператор для створення XName.
Джон Скіт,

23

Спробуйте помістити свій простір імен у {... }так:

string xfaNamespace = "{http://www.xfa.org/schema/xfa-template/2.6/}";

1
чому ви повинні використовувати фігурні дужки? Яка вигода?
barrypicker

1
Використання XNamespaceметоду по суті просто робить це за вас. .ToStringна XNamespaceочевидно просто форматує рядок правильно для вас. Отже, це те саме, що зроблено по-іншому, жодної користі немає
Ліам,

18

У мене була та ж помилка. Я виявив, що додаю код ...

var ab = "http://whatever-the-url-is";

... але ab було визначено як рядок. Це спричинило помилку, про яку повідомляє OP. Замість того, щоб використовувати ключове слово VAR, я використав фактичний тип даних XNamespace ...

XNamespace ab = "http://whatever-the-url-is";

... і проблема зникла.


7

Існує перевантаження методу Get, який ви можете спробувати, який враховує простір імен. Спробуйте це:

XElement tempElement = doc.Descendants(XName.Get("test", "ab")).FirstOrDefault();

1
abтут не є фактичним простором імен - це просто псевдонім простору імен. (На жаль, я не знаю правильної термінології.) LINQ to XML полегшує це XNamespace. Рідко коли вам потрібно явно викликати XName.GetLINQ до XML.
Джон Скіт,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.