Добавить блок строки XML к существующему XmlDocument - PullRequest
30 голосов
/ 07 октября 2008

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

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

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

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

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

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

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

Ответы [ 6 ]

83 голосов
/ 07 октября 2008

Я предлагаю использовать 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);
11 голосов
/ 07 октября 2008

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

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

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

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true));
6 голосов
/ 07 октября 2008

Как альтернатива, вот как вы могли бы сделать это более 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");
2 голосов
/ 07 октября 2008

Подумайте об использовании XmlWriter для создания своих фрагментов в StringBuilder, поскольку это обеспечит вам проверку и замену символов.

0 голосов
/ 30 сентября 2016

Ничего из этого не помогло мне, поэтому я поиграл в 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");
0 голосов
/ 05 февраля 2009

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

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

Bye.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...