Добавление тега XML через код - PullRequest
0 голосов
/ 27 августа 2011

Я пишу приложение на C #. У меня уже есть XML-файл, который не является пустым, и я хочу добавить в него новые значения, не удаляя существующие значения.

Я пробовал этот код:

Во-первых:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("RootEl");//root 

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

this.Close();

Второе:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("RootEl");//root-ot

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);

this.Close();

Третье:

FileStream docNewUser = new FileStream(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml", FileMode.Open);
XmlTextWriter xmlNewUser = new XmlTextWriter(docNewUser, null);
xmlNewUser.WriteStartDocument();

xmlNewUser.WriteStartElement("Zapis");

xmlNewUser.WriteStartElement("Name");
xmlNewUser.WriteString(txtEnterName.Text);
xmlNewUser.WriteEndElement();

xmlNewUser.WriteEndElement();//end of zapis                

xmlNewUser.WriteElementString("Ime", null, txtEnterName.Text);

this.Close();

Мне кажется, проблема в том, что поток не знает, куда поместить новое значение. еще немного информации: корневой элемент уже введен.

Ответы [ 4 ]

1 голос
/ 27 августа 2011

Когда вы пишете XML в файл таким способом, он всегда перезаписывает то, что было в файле ранее.Если вы хотите записать в него, используя XmlTextWriter, вам сначала нужно будет скопировать текущий контент и записать новые элементы в нужной позиции.Не забывайте, что вы не можете читать и записывать в один и тот же файл одновременно, поэтому вы должны использовать временный файл и перезаписать его оригиналом.Или вы сначала читаете весь файл в строку.Или сначала запишите свой результат в строку.

Но лучшим решением может быть использование XDocument (или XmlDocument) для загрузки всего документа, его изменения и сохранения.(Делать это не очень хорошая идея, если файл XML огромен.)

1 голос
/ 27 августа 2011

Если ваша версия .NET поддерживает это, используйте LINQ to XML .(Предостережение: я не эксперт, и, вероятно, есть более элегантный способ написать это.)

// Without error handling
var root = XElement.Load(@"C:\Users\TrueWill\Downloads\Foo.xml");

var product =
    (from item in root.Elements("item")
    where item.Element("name").Value == "Product1"
    select item)
    .Single();

product.Add(new XElement("size", "small"));

root.Save(@"C:\Users\TrueWill\Downloads\FooCopy.xml");

Мой тестовый файл (до):

<?xml version="1.0" encoding="utf-8"?>
<test>
<item><name>Product1</name></item>
<item><name>Product2</name></item>
</test>

Мой тестовый файлкопия (после) (я скопировал вместо замены):

<?xml version="1.0" encoding="utf-8"?>
<test>
  <item>
    <name>Product1</name>
    <size>small</size>
  </item>
  <item>
    <name>Product2</name>
  </item>
</test>
0 голосов
/ 27 августа 2011

Есть ли причина, по которой вы используете XmlTextWriter?Я считаю, * альтернативы LINQ to XML намного проще.

Ваш код будет выглядеть примерно так:

XElement el = new XElement("Zapis");
el.Add(new XElement("Name",txtEnterName.Text))
el.Save(@"C:\\MyApp\\MySubDir\\Data\\" + pr + ".xml")
0 голосов
/ 27 августа 2011

Использовать XmlDocument:

XmlDocument doc = new XmlDocument();
doc.Load("filepath");
XmlNode node = doc["MainNode"]["subnode1"]["subnode2"]; //to fetch the node after which you'd like to add something.
XmlElement stuffToAdd = doc.CreateNode("nodename");
stuffToAdd.InnerText = "the value of your added node";
node.AddChild(stuffToAdd);
doc.Save("filepath");

Я делаю это из памяти, поэтому имена методов приблизительны.

Как сказано в другом ответе, загрузка больших файлов XML с использованием XmlElement может быть дорогостоящей, поскольку она полностью загружается в память при вызове Load().

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