Копирование XML-файла с вставкой новых элементов в определенном месте - C # - PullRequest
2 голосов
/ 07 мая 2010

Привет, я хочу скопировать xml-файл и вставить в конкретный элемент locaiton еще несколько элементов; Какой самый лучший и простой способ сделать это. Я могу использовать элементы чтения xmlReader и писать по одному, обращаясь к каждому типу - у меня были некоторые проблемы с этим, но, кроме того, мне кажется, что слишком много работы, которую можно сделать как-то лучше. в приведенном ниже примере у меня есть XML как определение по умолчанию, необходимо создать новый XML в том же формате с вставкой новых значений в sheet1 - но после существующих строк, и сделать то же самое для sheet2.

<book>
   <Sheet ss:name="Sheet1">
      <Table >
      <Row >
        <Cell/>
        <Cell>
             Title Name      
        </Cell>
        <Cell >
             Title Description
         </Cell>
      </Row>
   </Sheet>
<a/>
<b/>
  <Sheet ss:name="Sheet2">
      <Table >
      <Row >
        <Cell/>
        <Cell>
             Title Name      
        </Cell>
        <Cell >
             Title Description
         </Cell>
      </Row>
   </Sheet>
</book>

1 Ответ

7 голосов
/ 07 мая 2010

На мой взгляд, простейшим способом было бы загрузить весь документ с использованием LINQ to XML, изменить его, а затем снова сохранить. Это, вероятно, будет проще, чем использовать XmlReader, что может показаться мне немного странным.

Однако это включает загрузку всего этого в память - что может быть проблемой, если документы огромны. Это может быть проблемой?

РЕДАКТИРОВАТЬ: Вот короткий пример в LINQ to XML (не проверено):

XDocument doc = XDocument.Load("test.xml");
XNamespace ss = "http://url/for/ss";
Sheet sheet1 = doc.Descendants("Sheet")
                  .Where(x => (string) x.Attribute(ss + "name") == "Sheet1");
XElement lastRow = sheet1.Elements("Row").LastOrDefault();
// Note: if there aren't any rows, lastRow will be null here. Handle accordingly
lastRow.AddAfterSelf(new XElement("Foo", "Extra value"));

Альтернатива последней части, если вы просто хотите новый контент после всего старого контента листа:

sheet1.Add(new XElement("Foo", "Extra value"));
...