如何从具有命名空间和模式的XML文档中提取元素集合

时间:2013-12-23 13:31:13

标签: xml linq xpath

我在尝试从XML文档中提取节点集合时遇到了永无止境的问题。我在StackOverflow上一直在玩几十个代码示例,但我总是得到一个空的结果集。我开始认为这可能与命名空间有关,但我似乎无法找到任何简单的例子来告诉我我做错了什么。这是我试图访问的(简化的)XML文件:

<?xml version="1.0" encoding="utf-8" ?>
<pages
    xmlns="http://myurl.co.uk/xml/Pages.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.myurl.co.uk/xml/Pages.xsd Pages.xsd"
>
    <page token="A">
        <page1>P1</page1>
        <page2>P2</page2>
    </page>
    <page token="B">
        <page1>P1</page1>
        <page2>P2</page2>
    </page>
    <page token="C">
        <page1>P1</page1>
        <page2>P2</page2>
    </page>
</pages>

架构......

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://myurl.co.uk/xml/Pages.xsd"
    targetNamespace="http://myurl.co.uk/xml/Pages.xsd"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
>
    <xs:element name="pages">
        <xs:complexType>
            <xs:sequence">
                <xs:element name="page" type="PageType">
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="PageType">
        <xs:sequence>
            <xs:element name="page1" type="xs:string"/>
            <xs:element name="page2" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="token" type="xs:string" use="required" />
    </xs:complexType>
</xs:schema>

我尝试过的数百个代码片段中的一个:

XDocument pageDoc = XDocument.Load( "Pages.xml" );
var a = pageDoc.Root.XPathSelectElements( "page" );
我正用这个撕掉我的头发。如果你可以提供任何帮助,我会尽量不要扯掉你的手臂,因为我拼命抢夺它。

亲切的祝愿〜帕特里克

2 个答案:

答案 0 :(得分:2)

 XDocument Xdoc = XDocument.Load(@"D:\xxxxxxxx\XMLFile1.xml");
 XNamespace ns = "http://myurl.co.uk/xml/Pages.xsd";

 var ele = from data in Xdoc.Descendants(ns + "pages").Elements(ns+"page")
            select data;

OR

 var namespaceManager = new XmlNamespaceManager(new NameTable());
                namespaceManager.AddNamespace("namespace", "http://myurl.co.uk/xml/Pages.xsd");
 var name = Xdco.XPathSelectElements("/namespace:pages/namespace:page", namespaceManager);

答案 1 :(得分:1)

这是一种方式:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath(@"~\xml\test.xml"));

XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable);
xmlnsManager.AddNamespace("def", "http://myurl.co.uk/xml/Pages.xsd");

XmlNodeList NodeList = xmlDoc.SelectNodes("/def:pages/def:page", xmlnsManager);

foreach (XmlNode node in NodeList)
{

}