编辑现有的XML文件树

时间:2018-12-30 18:48:54

标签: c# xml

我在编辑现有xml文件时遇到问题。我一直在寻找解决方案,但找不到所需的解决方案。有人可以帮我吗?

这是我的代码:

print

这是代码的结果: https://pastebin.com/LKGJER38

但是我需要这个: https://pastebin.com/RRC75pR8

我将不胜感激。

2 个答案:

答案 0 :(得分:0)

改为添加到Items元素:

private void referenceToXML(string path)
{
    var xmlDoc = XDocument.Load(path);

    xmlDoc.Element("ItemCollection").Element("Items").Add(
        new XElement("Item", new XAttribute("name", question.text), SM.text));

    xmlDoc.Save(path);
}

答案 1 :(得分:0)

您的问题是,每次添加<Items>元素时,您都无条件添加了<Item>元素。相反,您需要检查是否存在此类元素,如果存在,请使用它。以下extension method可以轻松实现:

public static partial class XNodeExtensions
{
    public static XElement GetOrAddElement(this XContainer container, XName name)
    {
        if (container == null || name == null)
            throw new ArgumentNullException();
        var element = container.Element(name);
        if (element == null)
            container.Add(element = new XElement(name));
        return element;
    }
}

现在,您可以修改referenceToXML方法以使用它,如下所示:

private static void referenceToXML(string path, string questionText, string smText)
{
    AddItem(XDocument.Load(path), questionText, smText).Save(path);
}

static XDocument AddItem(XDocument doc, string questionText, string smText)
{
    var firstNameElement = new XElement("Item");
    firstNameElement.SetAttributeValue("name", questionText);
    var lastNameElement = new XElement("Cathegory", smText);
    firstNameElement.Add(lastNameElement);

    // Get or create the root element ItemCollection
    var root = doc.GetOrAddElement("ItemCollection");
    // Get or create the Items list
    var items = root.GetOrAddElement("Items");
    // Add the item
    items.Add(firstNameElement);

    return doc;
}

演示小提琴here

请注意,为了清楚起见和测试目的,我修改了您的代码以使用question.textSM.text参数而不是类成员。