更改XML元素的值

时间:2015-05-10 11:42:38

标签: c# xml element

我正在尝试更改Xml元素的值:

<string id="68056"><![CDATA[Anti-Aliasing:]]></string>
<string id="68085"><![CDATA[V Sync:]]></string>
<string id="68100"><![CDATA[Frame Limit:]]></string>
<string id="68125"><![CDATA[Pixel Light Count:]]></string>
<string id="68162"><![CDATA[Shadow Cascades:]]></string>
<string id="68195"><![CDATA[* Game requires restart for changes to take effect *]]></string>
<string id="68300"><![CDATA[Video & Graphics]]></string>
<string id="68333"><![CDATA[Anti-Aliasing:   ]]></string>
<string id="68368"><![CDATA[Texture Quality: ]]></string>
<string id="68403"><![CDATA[Pixel Light Count: ]]></string>
<string id="68442"><![CDATA[Shadow Cascades: ]]></string>
<string id="68477"><![CDATA[Graphics]]></string>
<string id="68494"><![CDATA[AddonLoader: Exception iterating ']]></string>

我有数千条线路。 我想更改&lt;中的值。 !CDATA [...]&gt;部分,相对于 id 值。这是我所做的空虚,但它不起作用。

    public static void SetElement(int id, string text)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(File.OpenRead(PATH));
        foreach (XmlNode item in doc.DocumentElement.ChildNodes)
        {
            if (int.Parse(((XmlElement)item).GetAttribute("id")) == id)
            {
                doc.CreateCDataSection(text);
                doc.Save(PATH);
            }
        }
    }

我也尝试过使用doc.DocumentElement.Value = text而不是doc.CreateCDataSection(text),它也没用。

你能给我一个工作空白吗? :)

2 个答案:

答案 0 :(得分:0)

首先,我建议使用LINQ to XML而不是旧的XmlDocument模型 - 它更容易使用。

public static void SetElement(int id, string text)
{
    var doc = XDocument.Load(PATH);

    var element = doc.Descendants()
        .Single(e => (int)e.Attribute("id") == id);

    element.ReplaceNodes(new XCData(text));

    doc.Save(PATH);
}

虽然这段代码可行,但它并不理想 - 您每次都在解析,搜索和编写整个文档。如果您要更改多个元素的内容,则应重新使用XDocument并仅在完成后保存。

答案 1 :(得分:0)

尝试这样的事情

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {


        static void Main(string[] args)
        {
            string parent =
                "<parent>" +
                   "<string id=\"68056\"><![CDATA[Anti-Aliasing:]]></string>" +
                   "<string id=\"68085\"><![CDATA[V Sync:]]></string>" +
                   "<string id=\"68100\"><![CDATA[Frame Limit:]]></string>" +
                   "<string id=\"68125\"><![CDATA[Pixel Light Count:]]></string>" +
                   "<string id=\"68162\"><![CDATA[Shadow Cascades:]]></string>" +
                   "<string id=\"68195\"><![CDATA[* Game requires restart for changes to take effect *]]></string>" +
                   "<string id=\"68300\"><![CDATA[Video & Graphics]]></string>" +
                   "<string id=\"68333\"><![CDATA[Anti-Aliasing:   ]]></string>" +
                   "<string id=\"68368\"><![CDATA[Texture Quality: ]]></string>" +
                   "<string id=\"68403\"><![CDATA[Pixel Light Count: ]]></string>" +
                   "<string id=\"68442\"><![CDATA[Shadow Cascades: ]]></string>" +
                   "<string id=\"68477\"><![CDATA[Graphics]]></string>" +
                   "<string id=\"68494\"><![CDATA[AddonLoader: Exception iterating ']]></string>" +
                "</parent>";

            StringReader reader = new StringReader(parent);
            XDocument doc = XDocument.Load(reader);

            var results = doc.Root.Elements("string").OrderBy(x => x.Attribute("id").Value);

        }
    }
}
​