SelectSingleNode возвращает ноль даже при управлении пространством имен

Я пришел из этого вопроса, где была решена моя первая проблема: XML Выберите один узел, где повторяются имена. Сначала это была проблема с пространством имен.

Но теперь, даже когда ядро ​​NameSpace управляет моим XPath, оно по-прежнему возвращает меня в ноль.

Я также проверил:

SelectSingleNode возвращает ноль - даже с пространством имен SelectSingleNode всегда возвращает ноль? Проблема XmlDocument.SelectSingleNode и xmlNamespace. SelectSingleNode возвращает нулевое значение для известного хорошего пути к узлу xml с использованием XPath. Почему SelectSingleNode возвращает нулевое значение?

Но никто из них не помог мне. Я застрял на несколько часов в этом вопросе. Что с этим не так?

Спасибо за любую помощь.

Образец 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 "/>

                        </InkZoneProfile>
                    </InkZoneProfile>
                </InkZoneProfile>
            </InkZoneProfile>
        </ResourceCmdParams>
    </Command>
</JMF>

Мой код для выбора указанного XML-узла:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("C:\\XML\\test.xml");
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("C:\\XML\\test.xml");

1 ответ

Решение

В вашем XML есть пространство имен по умолчанию, элементы-потомки которого без префикса неявно наследуются от предка. Это означает, что не только корневой элемент, но и все элементы, упомянутые в вашем XPath, находятся в одном и том же пространстве имен по умолчанию, поэтому на них нужно ссылаться, используя тот же префикс:

//CIP4NS:Command/CIP4NS:ResourceCmdParams/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile/CIP4NS:InkZoneProfile
Другие вопросы по тегам