这是我的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)
请至少为我的第一个问题提供一个解决方案。
先谢了。
2条答案
按热度按时间qgzx9mmu1#
如果您试图让XPath在XSD模式上工作,请确保从XSD
xmlns:xs="http://www.w3.org/2001/XMLSchema"
声明名称空间。如果不想使用名称空间,可以按如下方式使用XPath:
rsl1atfo2#
九年后:)
是否需要在DocumentBuilderFactory示例上设置
setNamespaceAware(true);
?我读到解析器允许元素用o冒号命名,并且在早期不将其作为名称空间前缀,默认值为false。
但如果是这样的话,那么我就不明白“/schema/element”是如何工作的......:)