Добавить XML-строковый блок в существующий XmlDocument
У меня есть XmlDocument, который уже существует и читается из файла.
Я хотел бы добавить фрагмент Xml в документ node в документе. Есть ли хороший способ создать и добавить все узлы без загромождения кода ко многим вызовам .CreateNote и .AppendChild?
Мне хотелось бы как-то сделать строку или stringBuilder допустимого раздела Xml и просто добавить это в XmlNode.
например:
Оригинал XmlDoc:
<MyXml>
<Employee>
</Employee>
</MyXml>
и я хотел бы добавить тег Demographic (с несколькими детьми) к Employee:
<MyXml>
<Employee>
<Demographic>
<Age/>
<DOB/>
</Demographic>
</Employee>
</MyXml>
Ответы
Ответ 1
Я предлагаю использовать XmlDocument.CreateDocumentFragment, если у вас есть данные в строках свободной формы. Вам все равно придется использовать AppendChild, чтобы добавить фрагмент в node, но у вас есть свобода построения 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
Попробуйте следующее:
employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>";
Альтернативно (если у вас есть другой XML-документ, который вы хотите использовать):
employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true));
Ответ 3
В качестве альтернативы, вы можете сделать это более чем в 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");
Ответ 4
Рассмотрим использование XmlWriter для создания ваших фрагментов в StringBuilder, поскольку это обеспечит проверку и замену символов для вас.
Ответ 5
Все, что я делаю, это создать новый объект набора данных и открыть файл xml с помощью ReadXML myDataset.ReadXML(path and file name)
.
Затем добавьте или удалите нужные мне строки и сохраните документ снова, используя myDataset.WriteXML(path and file name)
.
Bye.
Ответ 6
Ничего из этого не работало для меня, поэтому я играл вокруг abit и вот мое решение.
Сначала загрузите текстовое поле (вы можете поместить его в visible = 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");