2010-11-26 1 views
2

У меня есть документ XML, который я пытаюсь выполнить, совместимый с SDMX. Вот краткий пример:Как получить XElement со специальными символами в теге XML

<root> 
    <csf:DataSet id="J10"> 
    <kf:Series> 
     <value> 107.92 
     </value> 
    </kf:Series> 
    </csf:DataSet> 
</root> 

Однако, когда я пытаюсь сделать следующее с помощью Linq для Xml в C#, я получаю XmlException.

XElement dataset = document.Element("csf:DataSet"); 

Текст Исключение: Символ «:» символ, шестнадцатеричное значение 0x3a, не могут быть включены в название.

У меня нет контроля над XML. Любые идеи о том, как я могу это преодолеть?

+2

Обратите внимание, что «:» не является специальным символом в теге. Это разделитель, который отделяет префикс пространства имен от локального имени элемента. – 2010-11-26 20:53:28

+1

В вашем XML отсутствуют объявления пространства имен. См. Мой полный пример. Если вы попытаетесь запустить его без «xmlns: crf = ...», метод Parse выдает исключение. – m0sa 2010-11-26 21:01:32

ответ

3
var csf = XNamespace.Get("<csfNamespaceUri>"); 
document.Element(csf + "DataSet"); 

Обратите внимание, что вы должны указать uri пространства имен csf. Полный пример:

var doc = XDocument.Parse(@" 
<root xmlns:csf=""http://tempuri.org/1"" xmlns:kf=""http://tempuri.org/2""> 
    <csf:DataSet id=""J10""> 
    <kf:Series> 
     <value> 107.92 
     </value> 
    </kf:Series> 
    </csf:DataSet> 
</root> 
"); 

var dataSet = doc.Descendants(XNamespace.Get("http://tempuri.org/1") + "DataSet").Single(); 
0

Попробуйте использовать XNamespace для определения элемента DataSet, который вы хотите извлечь.

0

У меня была та же проблема. Один из ответов здесь помогли мне на моем пути, но не полностью, так вот мое решение/уточнение:

Что вам нужно сделать, это указать URL для вашего пространства имен, например:

XNamespace ns = "http://www.example.com"; 

... то предварять это пространство имен в каждом Element:

var someElement = new XElement(ns + "ElementName", "Value"); 


для этой работы, однако, вы должны включить этот конкретный URI в XML следующим образом:

var rootElement = 
    new XElement(ns + "MyRootElement", 
       new XAttribute(XNamespace.Xmlns + "ns", 
           "http://www.example.com")); 

Теперь вы можете добавить someElement (и других) в rootElement, и пространство имен будет включена, поскольку она была ссылка (по URL) в корне:

rootElement.Add(someElement); 
rootElement.Add(new XElement(ns + "OtherElement", "Other value")); 

Это будет генерировать XML, который выглядит примерно так:

<ns:MyRootElement xmlns:ns="http://www.example.com"> 
    <ns:ElementName> (...) </ns:ElementName> 
    <ns:OtherElement> (...) </ns:OtherElement> 
</ns:MyRootElement> 
Смежные вопросы