0

这是我的 XML (wls.xml)

<?xml version="1.0"?>
    <note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

这是 XSD (wls.xsd)

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="note">
     <xs:complexType>
       <xs:sequence>
         <xs:element name="to" type="xs:string"/>
         <xs:element name="from" type="xs:string"/>
         <xs:element name="heading" type="xs:string"/>
         <xs:element name="body" type="xs:string"/>
       </xs:sequence>
    </xs:complexType>

这是我用来使用 Xpath 解析上述文件的 java 类

public static void test1()
{
    String ipFile="w3s.xml";//wls.xsd

    Node fetchNode=null;

    FileInputStream fileip;
    try {
        fileip = new FileInputStream(new File(ipFile));

        DocumentBuilder builder =   DocumentBuilderFactory.newInstance().newDocumentBuilder();      
        Document xmlDocument = builder.parse(fileip);

        System.out.println(xmlDocument.getDocumentElement().getNodeName());
        System.out.println(xmlDocument.getDocumentElement().getLocalName());
        evalXpath(xmlDocument,"//xs:element");//FAILS
        evalXpath(xmlDocument,"//element");//FAILS
        evalXpath(xmlDocument,"/schema/element");//WORKS
        evalXpath(xmlDocument,"/xs:schema/xs:element");//FAILS
        evalXpath(xmlDocument,"//heading");//FAILS



    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}


public static void evalXpath(Document xmlDocument,String expression)
{
    Node fetchNode=null;
    NodeList fetchNodeList=null;
    //String expression=null;
    try
    {
        XPath xPath =  XPathFactory.newInstance().newXPath(); 

        fetchNode = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
        System.out.println(fetchNode);

        fetchNodeList = (NodeList) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODESET);
        System.out.println(fetchNodeList.getLength());
    }
    catch (XPathExpressionException e) {
        e.printStackTrace();
    }    
}

}

当我解析 XML 文件并运行类型为 '\ElemName' 的表达式时,它可以正常工作并获取节点。不是然后我对 XSD 文件做同样的事情,它返回 NULL。对于 XSD,我需要起诉 '\RootNode\IntermediateNode....\ReqdNode' 我已经尝试使用不同的 XML 和 XSD 进行此操作,只是附加这些短文件以进行说明。

问题 2 还有一个问题:假设我有一个元素 'xs:schema' 并且我只需要获取像 'schema' 这样的本地名称部分(没有命名空间前缀),我该怎么做?我已经尝试过 getLocalName() 但它不起作用。

(如果您需要知道,我正在使用 jdk6)

请至少为我的第一个问题提供解决方案。

提前致谢。

4

1 回答 1

0

如果您尝试让 XPath 在 XSD 模式上工作,请确保从 XSD 声明命名空间xmlns:xs="http://www.w3.org/2001/XMLSchema"

如果您不想使用命名空间,可以使用 XPath,如下所示:

//*[local-name()='element']
/*[local-name()='schema']/*[local-name()='element']
于 2013-09-24T07:53:55.647 回答