2009-09-21 2 views
3

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

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

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

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

ответ

7

Как насчет:

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

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

+0

Hi Jon, спасибо за вашу помощь. Ваш ответ имеет смысл, но когда я пытаюсь использовать ваше предложение, VS говорит мне, что System.Xml.Linq.XElement не содержит определения для «LocalName». Я согласен с вашей точкой в ​​том, чтобы вручную создать XML как строку, но если мне нужно применить логику, как я могу сделать это в середине создания XML при его создании с помощью Linq? Еще раз спасибо. –

+0

Упс, отредактированный, чтобы получить локальное имя XName. Вы можете создать XML так же, как сейчас, просто сделайте XMLDetails XElement вместо строки. К сожалению, не совсем ясно, как вы позже используете XMLDetails, но это должно работать нормально. Если нет, просьба дать более подробную информацию - или предпочтительно короткую, но полную программу. –

1

Как это

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

 Смежные вопросы

  • Нет связанных вопросов^_^