2008-10-07 4 views
25

У меня есть XmlDocument, который уже существует и считывается из файла.Добавить XML-строковый блок в существующий XmlDocument

Я хотел бы добавить кусок Xml в узел в документе. Есть ли хороший способ создать и добавить все узлы, не загромождая мой код многими вызовами .CreateNote и .AppendChild?

Я хотел бы как-то сделать строку или stringBuilder допустимого раздела Xml и просто добавить это в XmlNode.

например: Оригинал XmlDoc:

<MyXml> 
    <Employee> 
    </Employee> 
</MyXml> 

и я хотел бы добавить Демографические (с несколькими детьми) тег Employee:

<MyXml> 
    <Employee> 
     <Demographic> 
     <Age/> 
     <DOB/> 
     </Demographic> 
    </Employee> 
</MyXml> 

ответ

71

Я предлагаю использовать XmlDocument.CreateDocumentFragment, если у вас есть данные в строках свободной формы. Вам все равно придется использовать AppendChild для добавления фрагмента к узлу, но у вас есть свобода построения XML в вашем StringBuilder.

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(@"<MyXml><Employee></Employee></MyXml>"); 

XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
xfrag.InnerXml = @"<Demographic><Age/><DOB/></Demographic>"; 

xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
+2

Краткая и точка зрения ... отлично! +1 – tigerswithguitars 2012-07-18 09:45:54

+0

Отличное решение – Nirman 2013-04-26 12:20:24

11

Попробуйте это:

employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>"; 

В качестве альтернативы (если у вас есть другой XML-документ, который вы хотите использовать):

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true)); 
2

Рассмотрим с помощью XmlWriter для создания ваших фрагментов на StringBuilder так как это обеспечит проверку и замену символов для вас.

6

В качестве альтернативы, это то, как вы могли бы сделать это в более LINQy 3.5 образом:

XDocument doc = XDocument.Load(@"c:\temp\test.xml"); 
XElement demoNode = new XElement("Demographic"); 
demoNode.Add(new XElement("Age")); 
demoNode.Add(new XElement("DOB")); 
doc.Descendants("Employee").Single().Add(demoNode); 
doc.Save(@"c:\temp\test2.xml"); 
0

Все, что я делаю, это создание нового объекта набора данных и откройте файл XML с помощью ReadXml myDataset.ReadXML(path and file name).

Затем добавьте или удалите строки, которые мне нужны, и сохраните документ снова, используя myDataset.WriteXML(path and file name).

До свидания.

0

Ничего из этого не работало для меня, поэтому я играл в abit, и вот мое решение.

Сначала загрузите текстовое поле (вы можете поместить его в видимое = false в общедоступной версии). загружает данные в текстовое поле.

string Path = Directory.GetCurrentDirectory() + "/2016"; 
      string pathFile = Path + "/klanten.xml"; 
      StreamReader sr = new StreamReader(pathFile); 
      txt.Text = sr.ReadToEnd(); 
      sr.Close(); 

на кнопке сохранения загрузите текстовое поле и сохраните его. Не забудьте, что после этого вам нужно будет обновить текстовое поле, если вы хотите добавить несколько адресов/имен, я не включил эту часть.

string name = Globals.s_Name; 
     string klanten = txt.Text; 
     string s = klanten; 
     XmlDocument xdoc = new XmlDocument(); 

     string klant = "<voornaam>" + naamBox1.Text + "</voornaam>"; 
     xdoc.LoadXml(s); 
     XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
     xfrag.InnerXml = klant; 
     xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
     xdoc.Save(name + "/klanten.xml"); 
Смежные вопросы