2013-09-13 2 views
2

Я пытаюсь добавить фрагмент Xml текст, который я подготовил к существующему документу в vb.net, я использую класс XmlDocument. Вот мой код (упрощенно объяснить проблему):C#/vb.net - Добавить текст XML в XmlDocument

Dim s As String = "<RelativeLayout android:layout_width=""fill_parent"" android:layout_height=""fill_parent"" android:layout_weight=""1.0"" />" 
Dim tempdoc = New XmlDocument() 
tempdoc.LoadXml("<doc />") 
ns = New XmlNamespaceManager(tempdoc.NameTable) 
ns.AddNamespace("android", "http://schemas.android.com/apk/res/android") 
tempdoc.DocumentElement.SetAttribute("xmlns:android", "http://schemas.android.com/apk/res/android") 
Dim frag = tempdoc.CreateDocumentFragment() 
frag.InnerXml = s 

Последняя инструкция генерирует XmlException, который считывает «андроид префикс необъявленный» я был под впечатлением, что либо XmlNamespaceManager (строки 4-5) или записи атрибут пространства имен напрямую (строка 6) позаботится об этом, но, по-видимому, нет.

Что я делаю неправильно?

Я знаю, что могу просто написать элемент вручную с помощью метода createelement, но пример, который я дал, упрощен, чтобы объяснить проблему. В действительности строка "s" - это большой кусок Xml с множеством атрибутов и подузлов, написав все это вручную с помощью кода. Что я хочу сделать, добавьте весь фрагмент Xml к документу, если это возможно.

ответ

1

Когда вы устанавливаете свойство InnerXml, он не использует контекст в диспетчере пространства имен. Вместо этого он предполагает, что все пространства имен будут явно определены внутри XML-фрагмента, предоставленного ему. Таким образом, это простое решение, это просто включать объявление пространства имен в фрагменте, как это:

Dim s As String = "<RelativeLayout xmlns:android=""http://schemas.android.com/apk/res/android"" android:layout_width=""fill_parent"" android:layout_height=""fill_parent"" android:layout_weight=""1.0"" />" 

Если вы не можете сделать это в строке фрагмента, вы всегда можете загрузить этот фрагмент во время выполнения и добавить атрибут объявления пространства имен с помощью метода SetAttribute. Затем вы можете использовать этот модифицированный фрагмент, чтобы присвоить свойству InnerXml.

В качестве альтернативы вы можете воспользоваться методом CreateElement, который позволит вам использовать диспетчер пространств имен.

0

Я бы предложил изучить XElement и XDocument в пространстве имен System.Xml.Linq. Он предлагает именно то, что вы ищете основной идеей является то, что вы хотите, как этот

XElement root = new XElement("RelativeLayout, 
      new XAttribute("android:layout_width", ""), 
      new XAttribute("fill_parent", "") //etc 
      ); 
root.Add(XElement.Parse(s)); 

Обратите внимание, что я не проверял этот код, но я использую код очень близко к этому часто так синтаксис Закрыть.

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