как добавить (или игнорировать) пространство имен XML при использовании XElement.Load - PullRequest
3 голосов
/ 21 сентября 2009

Я создаю XML, используя Linq to XML и C #. Все это прекрасно работает, за исключением случаев, когда мне нужно вручную добавить строку в XML. Эта строка добавляется только в том случае, если у меня есть значение для перехода к нему, в противном случае я просто игнорирую весь тег.

Я использую XElement.Load для загрузки строки текста, которую я храню в строке, но когда я присоединяю ее к XML, она всегда вставляет xmlns = "" в конце моего тега.

Есть ли способ сказать XElement.Load использовать существующее пространство имен или игнорировать его при добавлении строки в XML?

В идеале я просто хочу, чтобы моя строка была включена в создаваемый XML без добавления дополнительных тегов.

Ниже приведен пример того, чем я сейчас занимаюсь:

string XMLDetails = null;
if (ValuePassedThrough != null)
XMLDetails = "<MyNewTag Code=\"14\" Value=\"" + ValuePassedThrough +"\"></MyNewTag>";

Когда я собираю XML, я загружаю приведенную выше строку в свой XML. Именно здесь xmlns = "" добавляется к значению XMLDetails, но в идеале я хочу, чтобы это игнорировалось, так как это вызывает проблемы у получателя при попытке прочитать этот тег.

XNamespace ns = "http://namespace-address";
    XNamespace xsi = "http://XMLSchema-instance-address";

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(ns + "HeaderTag",
        new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
        new XAttribute("Version", "1"),
            new XElement(ns + "OpeningTAG",

... Мой код XML ...

XElement.Load(new StringReader(XMLDetails))

... Конец XML-кода ...

Как упомянуто выше. Мой код работает, он успешно выводит XML для меня. Это просто тег MyNewTag, который я загружаю при использовании XElement.Load, добавляет xmlns = "" в его конец, что вызывает у меня проблему.

Есть идеи, как я могу обойти это? Спасибо за вашу помощь.

С уважением, Рич

Ответы [ 2 ]

7 голосов
/ 21 сентября 2009

Как насчет:

XElement withoutNamespace = XElement.Load(new StringReader(XMLDetails));
XElement withNamespace = new XElement(ns + withoutNamespace.Name.LocalName,
                                      withoutNamespace.Nodes());

В качестве лучшей альтернативы - почему бы вам не включить пространство имен при создании XML или, что еще лучше, создать XElement вместо ручной генерации строки XML, которую вы затем читаете. Создание XML вручную - очень хорошая идея. Помимо всего прочего, вы предполагаете, что ValuePassedThrough уже сбежал или не нуждается в экранировании и т. Д. Что может быть действительным, но это как минимум повод для беспокойства.

1 голос
/ 21 сентября 2009

Как это

XElement XMLDetails = new XElement(ns + "OpeningTAG", new XElement(ns + "MyNewTag", new XAttribute("Code", 14), new XAttribute("Value", 123)));

XDocument RequestDoc = new XDocument(
    new XDeclaration("1.0", "utf-8", null),
    new XElement(ns + "HeaderTag",
        new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
        new XAttribute("Version", "1"),
            XMLDetails));
...