2015-05-10 2 views
0

Я пытаюсь изменить значение Xml элементов:Изменение значения из 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> 

У меня есть тысячи таких строчек. Я хочу изменить значения в разделе <! CDATA [...]>, относительно значения 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 = текст вместо doc.CreateCDataSection (текст), он не работает.

Можете ли вы дать мне рабочую пустоту, пожалуйста? :)

+0

Должно быть GetAttribute («id»). Значение – jdweng

+0

@jdweng - это не должно, поскольку это не скомпилировалось. 'GetAttribute' возвращает' string' - [см. Документы] (https://msdn.microsoft.com/en-us/library/acwfyhc7 (v = vs.110) .aspx) –

ответ

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 и сохранить только один раз.

0

Один из возможных способов использования 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); 
} 
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); 

     } 
    } 
} 
​ 
+0

Все это возвращает все элементы. Если необходимо обновить CDATA определенного идентификатора, как это решить проблему? –

+0

Он показывает правильный синтаксис получения атрибута «VALUE». – jdweng

+0

Возвращаемый атрибут value - это имя строки «id», а не значение, подобное 68056. – jdweng

Смежные вопросы