Как получить XElement со специальными символами в теге XML

У меня есть XML-документ, который я пытаюсь просмотреть, который совместим с SDMX. Вот краткий пример:

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

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

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

Текст исключения: Символ ':', шестнадцатеричное значение 0x3A, не может быть включено в имя.

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

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();

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

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

Что вам нужно сделать, это указать 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>
Другие вопросы по тегам