Как получить 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>