2015-04-13 6 views
2

Я пытаюсь заменить содержимое XElement с текстом, который содержит произвольные строки, включая HTML комментарии, напримерКак заменить значение XElement без изменения кодировки

<!-- an example goes here --> 
<add key="SampleDetailsImporter.StartFolder" value="c:\temp" /> 

Мой код

var section = configFile.Descendants(sectionToReplace).FirstOrDefault(); 
// Replace section if enabled and replacement supplied. 
if (section!=null && !string.IsNullOrEmpty(replacementString) && replaceEnabled) 
{ 
    section.SetValue(replacementString); 
} 

где replacementString что-то вроде

"<!-- an example goes here --> <add key=\"SampleDetailsImporter.StartFolder\" value=\"c:\temp\" />" 

Моя проблема в том, что после замены все символы < и> кодируются как &lt; и &gt;

мне нужен сохраненный файл конфигурации, чтобы выглядеть следующим образом:

<MenuPlugins> 
<!-- an example goes here --> 
<add key=\"SampleDetailsImporter.StartFolder\" value=\"c:\temp\" /> 
</MenuPlugins> 

и не так:

<MenuPlugins> 
&lt;!-- an example goes here --&gt; 
&lt;add key=\"SampleDetailsImporter.StartFolder\" value=\"c:\temp\" /&gt; 
</MenuPlugins> 

Как я могу преодолеть это? (Я пробовал применять методы System.Web.HttpUtility.Decode или Encode - никаких улучшений.)

ответ

1

Ответ заключается в использовании

section.ReplaceWith(XElement.Parse(replacementString); 

где replacementString включает теги элементов.

+0

Если вы используете 'ReplaceNodes' вместо' ReplaceWith', вам не нужно включать тег раздела в заменяемую строку, которая, как она выглядит, из вашего вопроса, как вы этого еще не знаете. –

+0

Но мне нужно сохранить любые комментарии xml в значении replacementString, которое, как вы говорите, будет отброшено. Мне нужно заменить существующий элемент точно значением replaceString и иметь встроенные новые строки (\ n или &xA;), переведенные в разрывы строк в XML, когда отображается файл конфигурации. –

+0

Патрик, см. Мой ответ. –

0

Вы можете попробовать использовать класс XmlDocument, он должен закодировать его желаемым образом.

+0

Я уже использую класс XDocument для загрузки XML и Linq To XML, чтобы найти интересующий элемент - что вы имели в виду? –

+0

XmlDocument doc = new XmlDocument(); doc.LoadXml (documentString); с документомString как весь xml, а затем doc.Save (filePath); – Will

0

Вы можете использовать

section.ReplaceNodes(XDocument.Parse(replacementString).Nodes()); 

Он всегда будет моим предпочтением, чтобы избежать манипулирования фрагмент XML в виде строки.

0

Спасибо всем. Я получил там в конце концов, используя смесь Linq для XML и «старые» Xml имен:

 XDocument configFile = XDocument.Load(fileToSearch); 
     var section = configFile.Descendants(sectionToReplace).FirstOrDefault(); 
     // Replace section if enabled and replacement supplied. 
     if (section != null && !string.IsNullOrEmpty(replacementString)) 
     { 
      section.ReplaceWith(XElement.Parse(replacementString.Replace(@"\n", "&#xA;"))); 
     } 

      //save the amended file 
      var newConfigFile = new System.Xml.XmlDocument(); 
      newConfigFile.LoadXml(configFile.ToString()); 
      newConfigFile.Save(fileToSearch); 

Там еще может быть улучшение, которые будут иметься в этом коде, но это одноразовое инструмент, который теперь делает так что я собираюсь оставить его там. Спасибо всем за вашу помощь.

0

Патрик,

Может быть, я не понял, но мой окончательный код, как показано ниже (который, кажется, не отбрасывать комментарии XML в строковые значения):

 var section = configFile.Descendants(sectionToReplace).FirstOrDefault(); 
     // Replace section if enabled and replacement supplied. 
     if (section != null && !string.IsNullOrEmpty(replacementString) && replaceEnabled) 
     { 
      section.ReplaceWith(XElement.Parse(replacementString.Replace(@"\n", "&#xA;"))); // &#xA; is an XML newline character 
      matches = true; 
      Console.WriteLine(string.Format("Section {0} replaced", sectionToReplace)); 
     } 

     //if we have changed a section then save the file, otherwise don't bother 
     if (matches) 
     { 
      //save the amended file. First transfer into an XmlDocument object, which converts the XML newline characters to genuine new lines 
      var newConfigFile = new System.Xml.XmlDocument(); 
      newConfigFile.LoadXml(configFile.ToString()); 
      newConfigFile.Save(fileToSearch); 
      return 100; // Set ERRORLEVEL in batch file environment, 100 = matches. 
     } 

Учитывая replacementString значение

replacementString = "<MenuPlugIns><!-- a comment -->\n<add key=\"xyz\" value=\"stuff\"/>"</MenuPlugIns>"; 

полученный XML является

<MenuPlugIns> 
<!-- a comment --> 
<add key="xyz" value="stuff"/> 
</MenuPlugIns> 

Это именно то, что я хочу. Спасибо за помощь.

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