如何在c#中修改XML文件?

时间:2014-02-26 10:34:01

标签: c# .net xml

<Customers>
  <Customer1>
    <Name>Bobby</Name>
    <Age>21</Age>
    <Address>Panjim</Address>
  </Customer1>
  <Customer2>
    <Name>Peter</Name>
    <Age>32</Age>
    <Address>Panjim</Address>
  </Customer2>
  <Customer4>
    <Name>Joel</Name>
    <Age>32</Age>
    <Address>Mapusa</Address>
  </Customer4>
</Customers>

所以我想删除一个特定的元素,当我删除第一个元素,即customer1时,我想更新其他元素。我的意思是我想制作customer3,customer2和customer2,customer1。 有人可以帮助我实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

怎么样:

class Program {
    static void Main(string[ ] args) {
        XDocument doc = XDocument.Load("D:\\file.xml"); //example file
        doc.Root.SwitchAndRemove("Customer1");
        doc.Save("D:\\file.xml");
    }
}

public static class Utilities {
    public static void SwitchAndRemove(this XElement customers, XName name) {
        var x = customers.Descendants().Where(e => e.Name == name).Select((element, index) => new { element, index }).Single();

        int count = 0;
        XElement temp = x.element;
        foreach (XElement el in customers.Nodes()) {
            if (count == x.index + 1) {
                temp.RemoveAll();
                temp.Add(el.Descendants().ToArray());
                temp = el;
            }
            else
                count++;
        }

        temp.Remove();
    }
}

通过输入xml作为输入,输出如下:

<?xml version="1.0" encoding="utf-8"?>
<Customers>
  <Customer1>
    <Name>Peter</Name>
    <Age>32</Age>
    <Address>Panjim</Address>
  </Customer1>
  <Customer2>
    <Name>Joel</Name>
    <Age>32</Age>
    <Address>Mapusa</Address>
  </Customer2>
</Customers>

答案 1 :(得分:0)

假设您必须删除的元素是Customer1,首先您可以使用c#中提供的XML解析类(如XDocument或XmlReader)读取完整的xml文件,并写入另一个xml文件,说&#34; Temp。 XML&#34;完全跳过Customer1元素。这样我们就实现了删除部分。

在更新之后,忘记该文件是XML文件并将整个文件读取为字符串,例如&#34; xmlstring&#34;。现在使用可用的字符串数据类型替换功能来替换&#34; Customer2&#34;与&#34; Customer1&#34;然后&#34; Customer3&#34;与&#34; Customer2&#34;等等。

现在删除原始XML文件并写入字符串&#34; xmlstring&#34;将流编写器用于文件名&#34; YourFileName.xml&#34;

多数民众赞成。希望这个解决方案适合您。试试这个,如果你不能完成这个,分享你试过的代码,我们将建议如何解决。

答案 2 :(得分:0)

从您的评论中获取订单不必保留,然后您可以执行此操作

public static void RemoveCustomer(XElement customers, XElement removeThis){

   var last = customeers.Elements().Last();
   if(last != removeThis){
       foreach(var element in removeThis.Elements()){
            element.Value = last.Element(element.Name).Value;
       }
   }
   last.Remove();
}

它有效地用最后一个替换掉了一个(除非最后一个被移除),从而消除了重命名任何其他元素的需要

答案 3 :(得分:0)

我认为您的问题不是如何以最小的努力重命名节点,而是XML文件的结构。

您说客户的订单并不重要,显然客户标签的编号也不重要,因为您想在删除时重命名标签。

所以这个结构可能会给你带来不必要的复杂性和额外的工作。

我认为您需要标记中的数字的唯一原因是识别您要删除的节点。我是对的还是还有更多的东西?如果没有,那么您可以将随机唯一标识符(如Guid)添加到您的客户数据中以删除正确的标识符。

可以省去很多麻烦。

<customers>
    <customer>
        <guid>07fb-877c-...</guid>
        <name>Notch</name>
        <age>34</age>
        <address>street</address>
    </customer>
    <customer>
        <guid>1435-435a-...</guid>
        <name>Sam</name>
        <age>23</age>
        <address>other</address>
    </customer>
<customers>