Я пытаюсь изменить xml и добавить в него дополнительный узел. Пока я могу добавить этот узел, но мне нужна небольшая настройка.
Мой образец XML
<Search Name = "Test2" ProjTypeID = "107">
<CritGroup CritGroupID = "1" >
<Crit CritID = "205"/>
<Crit CritID = "208"/>
</CritGroup></Search>
Я могу добавить дополнительный узел, но мне нужно добавить его как существующий формат узла «Крит» (где нет закрытия «Крит» вместо этого используется />). Но я получил результат ниже.
<Search Name = "Test2" ProjTypeID = "107">
<CritGroup CritGroupID = "1" >
<Crit>CritID = "206"</Crit>
<Crit CritID = "205"/>
<Crit CritID = "208"/>
</CritGroup> </Search>
Я использовал код ниже
XmlNode newNode = xmlDoc.CreateNode(XmlNodeType.Element, "Crit", "");
newNode.InnerText = "CritID=\"206\" ";
XmlNode CritGroupNode = xmlDoc["Search"]["CritGroup"];
XmlElement groups = CritGroupNode["CritGroup"];
CritGroupNode.InsertAfter(newNode, groups);
Также есть ли способ поставить новый узел последним! На данный момент его добавляют первым? Спасибо за чтение и вашу помощь!
я обновил его
Лучше использовать LINQ to XML вместо устаревшего API XML (около 2002–2006 гг.).
<Crit>CritID = "205"</Crit> не эквивалентно <Crit CritID = "205"/>. Способ установки атрибутов в XML заключается в использовании других элементов. Ближе всего к <Crit CritID = "205"/> будет <Crit><CritID>"205"</CritID></Crit>. Ссылка: w3schools.com/xml/xml_attributes.asp




Это очень просто через LINQ to XML.
С#
void Main()
{
XDocument xdoc = XDocument.Parse(@"<Search Name='Test2' ProjTypeID='107'>
<CritGroup CritGroupID='1'>
<Crit CritID='205'/>
<Crit CritID='208'/>
</CritGroup>
</Search>");
xdoc.Dump("Before");
XElement CritGroup = xdoc.Descendants("CritGroup")
.Where(x => x.Attribute("CritGroupID").Value == "1").FirstOrDefault();
CritGroup.Add(new XElement("Crit",
new XAttribute("CritID","206"),
new XAttribute("RelID","280"),
new XAttribute("CompValue","11")));
Console.WriteLine(xdoc);
}
Выход
<Search Name = "Test2" ProjTypeID = "107">
<CritGroup CritGroupID = "1">
<Crit CritID = "205" />
<Crit CritID = "208" />
<Crit CritID = "206" RelID = "280" CompValue = "11" />
</CritGroup>
</Search>
Спасибо за ваш ответ, не могли бы вы сообщить мне, как добавить больше предметов вместе с CritID. Что-то вроде <Crit CritID = "206" RelID = "280" CompValue = "11" CompValueHuman = "Yes" AndOr = "AND" TextBoxName = "" /> . Спасибо !.
Я обновил ответ. LINQ to XML делает это очень простым. Вы можете добавить столько XML-атрибутов, сколько необходимо.
Мое требование теперь немного более тонкое, и я хочу добавить новый элемент в качестве второго элемента, если вообще существует какой-либо элемент с CritID = 205.
Пожалуйста, задайте новый вопрос и предоставьте минимально воспроизводимый пример.
вы можете попробовать этот код
XmlElement newElement = xmlDoc.CreateElement("Crit");
newElement.SetAttribute("CritId", "204");
XmlNode CritGroupNode = xmlDoc["Search"]["CritGroup"];
XmlElement groups = CritGroupNode["CritGroup"];
CritGroupNode.InsertAfter(newElement, groups);
Я бы использовал решение XDocument в другом ответе, но если это невозможно, новый элемент Crit будет вставлен последним.
XmlElement newNode = xmlDoc.CreateElement("Crit");
newNode.SetAttribute("CritID", "206");
XmlNode CritGroupNode = xmlDoc["Search"]["CritGroup"];
CritGroupNode.InsertAfter(newNode, CritGroupNode.LastChild);
Ваш XML неправильно сформирован. Отсутствует корневой узел.