我现在要指出,我是使用 saxon 的新手,我已经尝试按照包中的文档和示例进行操作,但我只是没有运气解决这个问题。
基本上,我正在尝试使用 saxon v8 在 java 中进行一些 xml 处理。为了让某些东西正常工作,我采用了包中包含的一个示例文件并根据我的需要进行了修改。只要我不使用名称空间,它就可以工作,这是我的问题。如何解决命名空间问题?我真的不在乎使用它,但它存在于我的 xml 中,所以我要么必须使用它,要么忽略它。任何一种解决方案都很好。
无论如何,这是我的入门代码。它什么也不做,只是进行一个 xpath 查询尝试将它用于硬编码的 xml 文档。
public static void main(String[] args) {
String query = args[0];
File XMLStream=null;
String xmlFileName="doc.xml";
OutputStream destStream=System.out;
XQueryExpression exp=null;
Configuration C=new Configuration();
C.setSchemaValidation(false);
C.setValidation(false);
StaticQueryContext SQC=new StaticQueryContext(C);
DynamicQueryContext DQC=new DynamicQueryContext(C);
QueryProcessor processor = new QueryProcessor(SQC);
Properties props=new Properties();
try{
exp=processor.compileQuery(query);
XMLStream=new File(xmlFileName);
InputSource XMLSource=new InputSource(XMLStream.toURI().toString());
SAXSource SAXs=new SAXSource(XMLSource);
DocumentInfo DI=SQC.buildDocument(SAXs);
DQC.setContextNode(DI);
SequenceIterator iter = exp.iterator(DQC);
while(true){
Item i = iter.next();
if(i != null){
System.out.println(i.getStringValue());
}
else break;
}
}
catch (Exception e){
System.err.println(e.getMessage());
}
}
一个示例 XML 文件在这里...
<?xml version="1.0"?>
<ns1:animal xmlns:ns1="http://my.catservice.org/">
<cat>
<catId>8889</catId>
<fedStatus>true</fedStatus>
</cat>
</ns1:animal>
如果我使用包含命名空间的查询运行它,我会收到错误消息。例如:
/ns1:animal/cat/
给出错误:“Prefix ns1 has not been declared”。
如果我从查询中删除 ns1: ,它什么也没给我。如果我修改 xml 以删除“动物”前面的“ns1:”,我可以/animal/cat/
成功运行查询。
任何帮助将不胜感激。谢谢。