簡體   English   中英

更改XML元素的值

[英]Change value of an 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>

我有成千上萬的這樣的台詞。 我想相對於id值更改<!CDATA [...]>部分中的值。 這是我造成的空白,但無效。

    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),它也不起作用。

你能給我一個工作上的空白嗎? :)

首先,我建議使用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並僅在完成后保存。

使用XmlDocument一種可能方法:

public static void SetElement(int id, string text)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(File.OpenRead(PATH));

    var xpath = String.Format("//*[@id='{0}']", id);
    var str = doc.SelectSingleNode(xpath);
    var cdata = (XmlCDataSection)str.FirstChild;
    cdata.InnerText = text;

    doc.Save(PATH);
}

或者,如果您有能力切換到較新的API,請使用XDocument

public static void SetElement(int id, string text)
{
    var doc = XDocument.Load(PATH);
    var str = docx.Descendants()
                  .FirstOrDefault(o => (int?)o.Attribute("id") == id);
    var cdata = (XCData)str.FirstNode;
    cdata.Value = text;

    doc.Save(PATH);
}

試試這個

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

        }
    }
}
​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM