java 用于搜索与根节点不相关的节点的Xpath表达式对XML文件有效,但对XSD文件无效

ctehm74n  于 2023-01-07  发布在  Java
关注(0)|答案(2)|浏览(86)

这是我的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)
请至少为我的第一个问题提供一个解决方案。
先谢了。

qgzx9mmu

qgzx9mmu1#

如果您试图让XPath在XSD模式上工作,请确保从XSD xmlns:xs="http://www.w3.org/2001/XMLSchema"声明名称空间。
如果不想使用名称空间,可以按如下方式使用XPath:

//*[local-name()='element']
/*[local-name()='schema']/*[local-name()='element']
rsl1atfo

rsl1atfo2#

九年后:)
是否需要在DocumentBuilderFactory示例上设置setNamespaceAware(true);
我读到解析器允许元素用o冒号命名,并且在早期不将其作为名称空间前缀,默认值为false。
但如果是这样的话,那么我就不明白“/schema/element”是如何工作的......:)

相关问题