Требуется диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или определяемую пользователем функцию.

У меня есть следующий XML

<DataTable xmlns = "http://schemas.datacontract.org/2004/07/System.Data">
    <xs:schema
        id = "NewDataSet"
        xmlns = ""
        xmlns:xs = "http://www.w3.org/2001/XMLSchema"
        xmlns:msdata = "urn:schemas-microsoft-com:xml-msdata">
        <xs:element
            name = "NewDataSet"
            msdata:IsDataSet = "true"
            msdata:MainDataTable = "Table"
            msdata:UseCurrentLocale = "true">
            <xs:complexType>
                <xs:choice minOccurs = "0" maxOccurs = "unbounded">
                    <xs:element name = "Table">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element
                                    name = "Id"
                                    type = "xs:int"
                                    minOccurs = "0"/>
                                <xs:element
                                    name = "Industry"
                                    type = "xs:string"
                                    minOccurs = "0"/>
                                <xs:element
                                    name = "ParentId"
                                    type = "xs:int"
                                    minOccurs = "0"/>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:choice>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    <diffgr:diffgram xmlns:msdata = "urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr = "urn:schemas-microsoft-com:xml-diffgram-v1">
        <NewDataSet xmlns = "">
            <Table diffgr:id = "Table1" msdata:rowOrder = "0">
                <Id>1592</Id>
                <Industry>Fortune 100</Industry>
                <ParentId>1810</ParentId>
            </Table>
            <Table diffgr:id = "Table2" msdata:rowOrder = "1">
                <Id>1601</Id>
                <Industry>Oil &amp; Gas Operations</Industry>
                <ParentId>0</ParentId>
            </Table>
             </NewDataSet>
    </diffgr:diffgram>
</DataTable>

Мне нужны узлы с parentID = 0

но когда я использую следующий код:

 Dim parentNodes As XmlNodeList = xml_node.SelectNodes("/DataTable/diffgr:diffgram/NewDataSet/Table[ParentId=0]")

я получаю эту ошибку

Требуется диспетчер пространства имен или XsltContext. Этот запрос имеет префикс, переменную или определяемую пользователем функцию.

Пожалуйста, предложите решение


person DotnetSparrow    schedule 26.06.2012    source источник


Ответы (3)


Вам нужно добавить следующее перед SelectNodes

XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);
xmlnsManager.AddNamespace("bk", "urn:Books")
xmlnsManager.AddNamespace("pub", "urn:Publisher")
person Abi Bellamkonda    schedule 18.10.2012

для показанного примера это должно быть:

XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);
xmlnsManager.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema")
xmlnsManager.AddNamespace("msdata", "urn:schemas-microsoft-com:xml-msdata")
person energyguy78    schedule 12.12.2013

Вы также можете не использовать XmlNamespaceManager. Документ можно просмотреть с помощью GetElementsByTagName, но он требует большего внимания, вы уже должны были знать о структуре вашего xmlDocument:

var nodes = document.GetElementsByTagName("xsl:import");
var href =  nodes[0].Attributes["href"];//be sure which node to take
person Daniel B    schedule 22.09.2017
comment
Отличный ответ! Мне нужно было получить 1-й узел <w:p> в документе Word. Используя некоторые методы OpenXml, чтобы прочитать его в строку, я вызвал docText: XmlDocument xml = new XmlDocument(); xml.LoadXml(docText); XmlNodeList nodes = xml.GetElementsByTagName("w:p"); XmlNode hrefTag = nodes[0];, чтобы захватить узел. Ваш метод хорошо сработает для OP, выполнив XmlNodeList nodes = xml.GetElementsByTagName("xs:sequence");, затем XmlNode parentId = nodes[2]; - person vapcguy; 15.11.2018
comment
@vapcguy рад помочь :) - person Daniel B; 15.11.2018
comment
Я не думаю, что это требует этого - мне это показалось хорошим ответом ... Другие уже проголосовали за него, как и я. Первоначальный вопрос казался больше теорией, чем практическим применением, но вы охватили этот аспект путем ссылки на шаблоны проектирования. Возможно, захочется подытожить, что находится по ссылке на случай, если она будет перемещена. Это все, что я могу предложить для улучшения. - person vapcguy; 18.11.2018