2010-05-07 98 views
2

嗨我想复制一个xml文件并插入一些特定的元素locaiton更多的元素; 这样做的最好和最简单的方法是什么。我可以使用xmlReader读取元素并逐个写入每一种类型 - 我对此有一些问题,但是除此之外,对我来说太麻烦了,可以以某种方式更好地完成。 在下面的例子中,我有xml作为默认定义,需要以相同的格式创建新的xml,并向sheet1插入新值 - 但在现有行之后,并为sheet2执行相同的操作。复制一个xml文件,并在特定位置插入新元素 - C#

<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> 

回答

7

在我看来,最简单的方式将加载使用LINQ to XML整个文件,修改它,然后再保存它。这可能比使用XmlReader更容易,根据我的经验,这可能会有点毛。

但是,这确实涉及将它全部加载到内存中 - 如果文档很大,这可能是个问题。这可能是一个问题吗?

编辑:下面是LINQ一个简单的例子,以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")); 
+0

似乎是这样,原始的xmlFormat文件并不那么庞大,而最终的结果可能包含几MB。有任何链接/如何使用linq做到这一点的例子。我需要获取所有数据直到找到元素(示例中的shhet)将其复制到新的xml,插入新数据,并在所需元素后复制所有数据。谢谢你的帮助!!! Plus-在这种情况下xmlReader或linq与xml之间的优缺点比较 – user271077 2010-05-07 12:59:16

+0

如果您将整个内容读入内存,则不需要执行任何复制操作:只需适当修改该树,然后将其保存之后。 LINQ to XML over XmlReader的好处是代码会简单得多。缺点是你*将*拥有内存中的所有数据。几MB根本不应该是一个问题。我会写一个你可能做什么的例子。 – 2010-05-07 13:17:54

+0

谢谢,感谢。我应该关注什么文件大小? – user271077 2010-05-07 13:21:33