[英]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.