Как получить XElement со специальными символами в теге XML - PullRequest
2 голосов
/ 26 ноября 2010

У меня есть 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 ]

3 голосов
/ 26 ноября 2010
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 голосов
/ 14 марта 2013

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

Что вам нужно сделать, это указать 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>
0 голосов
/ 26 ноября 2010

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

...