Установка атрибутов в XML-документе

Я пишу одну из своих первых программ на C#. Вот что я пытаюсь сделать:

  • Открыть XML-документ
  • Перейдите к части XML-дерева и выберите все дочерние элементы типа <myType>
  • Для каждого <myType>элемента измените атрибут (так <myType id="oldValue">станет<myType id="newValue">
  • Запишите этот измененный XML-документ в файл.

Я нашел XmlDocument.SelectNodes метод, который принимает выражение XPath в качестве аргумента. Однако он возвращает XmlNodeList . Я немного прочитал о разнице между узлом XML и элементом XML, и это, кажется, объясняет, почему нет XmlNode.SetAttribute метода. Но есть ли способ использовать выражение XPath для получения списка XmlElement объектов, чтобы я мог просмотреть этот список и установить id атрибуты для каждого?

(Если есть другой способ попроще, дайте мне знать.)

Ответов (3)

Решение

Просто - он не знает, читаете ли вы элемент или атрибут. Вполне возможно, что все, что вам нужно, это слепок здесь:

foreach(XmlElement el in doc.SelectNodes(...)) {
    el.SetAttribute(...);
}

SelectNodes возвращает XmlNodeList, но в приведенном выше описании каждый рассматривается как XmlElement.

Я сижу за своим Mac, так что .NET для меня нет ...

Однако я думаю, что вы можете преобразовать XmlNode в XmlElement с помощью явного преобразования.

Тогда вы сможете преобразовать XmlElement в XmlNode и получить его дочерние узлы, используя что-то вроде XmlNode.ChildNodes.

Я большой поклонник System.Xml.Linq.XDocument и предоставляемых им функций.

XDocument xDoc = XDocument.Load("FILENAME.xml");

// assuming you types is the parent and mytype is a bunch of nodes underneath
IEnumerable<XElement> elements = xdoc.Element("types").Elements("myType");

foreach (XElement type in elements)
{
    // option 1
    type.Attribute("id").Value = NEWVALUE;
    // option 2
    type.SetAttributeValue("id", NEWVALUE);
}

Вариант 1 или 2 работает, но я предпочитаю 2, потому что, если атрибут не существует, он будет создан.