как добавить (или игнорировать) пространство имен XML при использовании XElement.Load

StackOverflow https://stackoverflow.com/questions/1453564

  •  12-09-2019
  •  | 
  •  

Вопрос

Я создаю 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.Именно здесь к значению XMLDetails добавляется xmlns="" но в идеале я хочу, чтобы это игнорировалось, поскольку это вызывает проблемы у получателя, когда он пытается прочитать этот тег.

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="" что вызывает у меня проблему.

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

С уважением, богатый

Это было полезно?

Решение

Как насчет:

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

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

Другие советы

Так

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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top