XML Выберите один узел, где имена повторяются

У меня есть этот XML:

<?xml version="1.0" encoding="utf-8"?>
<JMF SenderID="InkZone-Controller" Version="1.2" xmlns="http://www.CIP4.org/JDFSchema_1_1">
    <Command ID="cmd.00695" Type="Resource">
        <ResourceCmdParams ResourceName="InkZoneProfile" JobID="K_41">
            <InkZoneProfile ID="r0013" Class="Parameter" Locked="false" Status="Available" PartIDKeys="SignatureName SheetName Side Separation" DescriptiveName="Schieberwerte von DI" ZoneWidth="32">
                <InkZoneProfile SignatureName="SIG1">
                    <InkZoneProfile Locked="false" SheetName="S1">
                        <InkZoneProfile Side="Front">
                            <InkZoneProfile Separation="designer P&G 1901" ZoneSettingsX="0.391 0.36 0.097 0.058 0 0 0 0 0 0 0 0 0.178 0.394 0.201 0.088"/>

Я пытаюсь добавить элементы сразу после узла, но не могу. С моим кодом я попытался выбрать узел с XPath:

           XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(GlobalVars.FullPath);
            xmlDoc.SelectSingleNode("JMF/Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile");
            XmlElement IZP = xmlDoc.CreateElement("InkZoneProfile");
            IZP.SetAttribute("Separation", x.colorname);
            IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
            xmlDoc.DocumentElement.AppendChild(IZP);
            xmlDoc.Save(GlobalVars.FullPath);

Но он не добавляется к выбранному мной узлу - вместо этого он продолжает добавляться к последней строке. Как я могу добавить к этой конкретной позиции? Я пропускаю некоторые аргументы?

Благодарю.

РЕДАКТИРОВАТЬ: текущий код XML SelectNode обновлен с управлением NameSpace.

XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(GlobalVars.FullPath);
                XmlNode root = xmlDoc.DocumentElement;
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
                nsmgr.AddNamespace("CIP4NS", "http://www.CIP4.org/JDFSchema_1_1");

                var parent = root.SelectSingleNode("//CIP4NS:Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile", nsmgr);
                XmlElement IZP = xmlDoc.CreateElement("InkZoneProfile");
                IZP.SetAttribute("Separation", x.colorname);
                IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
                parent.AppendChild(IZP);
                xmlDoc.Save(GlobalVars.FullPath);

1 ответ

Решение
  1. Вы не используете возвращаемое значение xmlDoc.SelectSingleNode("JMF/Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile");, XmlNode.SelectSingleNode ничего не меняет в XmlDocument - возвращает XmlNode по указанному пути.
  2. xmlDoc.DocumentElement.AppendChild добавит элемент непосредственно перед концом корневого элемента, и ваш корневой элемент <JMF SenderID="InkZone-Controller" Version="1.2" xmlns="http://www.CIP4.org/JDFSchema_1_1">,

Таким образом, вы, вероятно, должны сохранить результат SelectSingleNode и добавить ребенка к нему:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(GlobalVars.FullPath);
var parent = xmlDoc.SelectSingleNode("JMF/Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile");
XmlElement IZP = xmlDoc.CreateElement("InkZoneProfile");
IZP.SetAttribute("Separation", x.colorname);
IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
parent.AppendChild(IZP);
xmlDoc.Save(GlobalVars.FullPath);
Другие вопросы по тегам