Member 11546646 Ответов: 4

Редактирование строк XML с помощью языка C#


Я все еще занимаюсь всей этой автоматизацией, и есть еще области, с которыми я незнаком – сегодня это оказывается редактирование XML.
Я не очень много работал с XML-файлами, поэтому немного борюсь с тем, что пытаюсь сделать.

Мне нужно отредактировать 3 строки версий в XML-файле, увеличив номер версии "PhoneVersion", "TabletVersion" и "DesktopVersion" на 1.

См. XML ниже

<configuration>
  <appSettings>
    <add key="PhoneVersion" value="36.999.1" />
    <add key="TabletVersion" value="36.999.1" />
    <add key="DesktopVersion" value="36.999.1" />
    <add key="ToolsEnabledKey" value="tokolosheQA" />
    <add key="ToolsURL" value="" />
    <add key="DbCommandTimeOut" value="60" />
  </appSettings>
</configuration>


Мне не очень повезло на самом деле читать или получать доступ к отдельным элементам/атрибутам.

Что я уже пробовал:

Это то, что я пробовал

XDocument doc = XDocument.Load(webconfig);

foreach (XElement add in doc.Descendants("add"))
 {
    string[] values = add.Attribute("value").Value.Split(new char[] { '.' });
    values[values.Length - 1] = (int.Parse(values[values.Length - 1]) + 1).ToString();
    add.SetAttributeValue("value", string.Join(".", values));
 }

4 Ответов

Рейтинг:
2

Maciej Los

Xml-файл не содержит строк! XML[^] контент - это набор узлов!


Попробовать это:

XDocument xdoc = XDocument.Load(webconfig);
var nodes = xdoc.Descendants("add")
	.Select(x=> new
	{
		NodeName = x.Name,
		Key = (string)x.Attribute("key").Value,
		Value = (string)x.Attribute("value").Value
	})
	.ToList();


Результат:
NodeName  Key               Value
add       PhoneVersion      36.999.1 
add       TabletVersion     36.999.1 
add       DesktopVersion    36.999.1 
add       ToolsEnabledKey   tokolosheQA 
add       ToolsURL   
add       DbCommandTimeOut  60 


чтобы выбрать один узел:
XElement singlenode = xdoc.Descendants("add")
	.Where(x=> (string)x.Attribute("key").Value == "DesktopVersion")
	.SingleOrDefault();

singlenode.Attribute("value").Value = "Bla bla bla";

//save changes
xdoc.Save(webconfig)


Дополнительные сведения о манипулировании xml-контентом см. В разделе: Класс XDocument (System.Xml.Linq)[^]


Рейтинг:
2

Gerry Schmitz

Использовать "диспетчер конфигураций" управление "параметры конфигурации ":

Конфигурационный менеджер.Свойство AppSettings (System.Конфигурация)[^]


Рейтинг:
1

Leo Chapiro

Попробуйте сделать это, предположив, что ваш XML находится в _strXml:

using System.Xml;


XmlDocument oDom = new XmlDocument();
oDom.LoadXml(_strXml);

XmlNode oXmlNode = oDom.FirstChild; // node "configurartion"
oXmlNode = oXmlNode.FirstChild;     // node "appSettings"

foreach (XmlNode oNode in oXmlNode.ChildNodes)
{
    if (oNode.Attributes["key"].Value == "PhoneVersion")
        oNode.Attributes["value"].Value = "whatever";
    // ... and so long ...
}


Member 11546646

Так что в этом есть смысл! Однако я продолжаю получать ошибку

"CMLException было обработано - данные на корневом уровне, является недействительным. Линия 1, Позиция 1."


строка webconfig = BuildLocation + "\\Web.config";

XmlDocument oDom = новый XmlDocument();
oDom.LoadXml(webconfig);

Руководство oXmlNode = одом.Возвращение null;
oXmlNode = oXmlNode.Возвращение null;


foreach (XmlNode oNode в oXmlNode.ChildNodes)
{
если (oNode.Атрибуты["ключ"].Value == "PhoneVersion")
oNode.Значение атрибута"].Значение = "36.999.0.01";

}

Рейтинг:
0

Member 11546646

ТАК ЧТО ПОСЛЕ ТОГО, КАК ВЫ ПОВОЗИЛИСЬ С НЕКОТОРЫМИ ИДЕЯМИ, КОТОРЫЕ ВЫ МНЕ ДАЛИ - ЭТО СРАБОТАЛО ПАРЕНЬ!!

string newValue = string.Empty;
     XmlDocument xmlDoc = new XmlDocument();

     xmlDoc.Load(webconfig);

     XmlNode PhoneVersionNode =
     xmlDoc.SelectSingleNode("configuration/appSettings/add[@key='PhoneVersion']");
     PhoneVersionNode.Attributes[1].Value = "newValue";


     xmlDoc.Save(webconfig);


СПАСИБО ЗА ПОМОЩЬ