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

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

有人可以帮助我实现这个吗?


7
如果结构是 <customers><customer /><customer /><customers>,那么只需删除所需节点,生活会更轻松吧? - Mikko Viitala
元素必须保持相同的顺序吗? - Rune FS
@RuneFS 它们不必按相同的顺序排列。 - maestrosan11
谢谢大家的回答。我通过更改XML结构解决了我的问题。再次感谢。 - maestrosan11
@maestrosan11 没问题。你能把最佳回复标记为答案吗? - Mikko Viitala
4个回答

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>

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();
}

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


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>

0

假设你需要删除的元素是Customer1,首先可以使用C#中提供的XML解析类之一(如XDocument或XmlReader)读取完整的xml文件,并将其写入另一个xml文件(例如“Temp.xml”),跳过完全删除Customer1元素。这样我们已经实现了删除部分。

接下来是更新部分,将文件视为普通字符串并读取整个文件到一个字符串(如“xmlstring”)中。现在使用字符串数据类型中可用的Replace函数将“Customer2”替换为“Customer1”,然后将“Customer3”替换为“Customer2”等。

现在删除原始XML文件,并使用流编写器将字符串“xmlstring”写入名为“YourFileName.xml”的文件中。

就是这样,希望这个解决方案对你有用。尝试一下,如果您无法完成此操作,请分享您尝试的代码,我们将建议如何解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接