有没有一种方法可以为Java文档提供用于XPath查询的XML模式
有没有一种方法可以为Java文档提供用于XPath查询的XML模式,java,xpath,xsd,Java,Xpath,Xsd,javax.xml.parsers.DocumentBuilder可以从一个xml文件流构建文档。然而,我找不到任何方法也给它一个模式文件 有没有办法让我的XPath查询能够执行类型感知查询并返回类型化数据?JAXP API是为XPath 1.0设计的,从未升级到处理模式感知查询等2.0概念。如果您使用的是Saxon,请使用s9api接口而不是JAXP 以下是saxon参考资料下载中s9apiExamples.java中的模式感知XPath示例: /** * Demonstrate use o
javax.xml.parsers.DocumentBuilder
可以从一个xml文件流构建文档。然而,我找不到任何方法也给它一个模式文件
有没有办法让我的XPath查询能够执行类型感知查询并返回类型化数据?JAXP API是为XPath 1.0设计的,从未升级到处理模式感知查询等2.0概念。如果您使用的是Saxon,请使用s9api接口而不是JAXP 以下是saxon参考资料下载中s9apiExamples.java中的模式感知XPath示例:
/**
* Demonstrate use of a schema-aware XPath expression
*/
private static class XPathC implements S9APIExamples.Test {
public String name() {
return "XPathC";
}
public boolean needsSaxonEE() {
return true;
}
public void run() throws SaxonApiException {
Processor proc = new Processor(true);
SchemaManager sm = proc.getSchemaManager();
sm.load(new StreamSource(new File("data/books.xsd")));
SchemaValidator sv = sm.newSchemaValidator();
sv.setLax(false);
XPathCompiler xpath = proc.newXPathCompiler();
xpath.declareNamespace("saxon", "http://saxon.sf.net/"); // not actually used, just for demonstration
xpath.importSchemaNamespace(""); // import schema for the non-namespace
DocumentBuilder builder = proc.newDocumentBuilder();
builder.setLineNumbering(true);
builder.setWhitespaceStrippingPolicy(WhitespaceStrippingPolicy.ALL);
builder.setSchemaValidator(sv);
XdmNode booksDoc = builder.build(new File("data/books.xml"));
// find all the ITEM elements, and for each one display the TITLE child
XPathSelector verify = xpath.compile(". instance of document-node(schema-element(BOOKLIST))").load();
verify.setContextItem(booksDoc);
if (((XdmAtomicValue)verify.evaluateSingle()).getBooleanValue()) {
XPathSelector selector = xpath.compile("//schema-element(ITEM)").load();
selector.setContextItem(booksDoc);
QName titleName = new QName("TITLE");
for (XdmItem item: selector) {
XdmNode title = getChild((XdmNode)item, titleName);
System.out.println(title.getNodeName() +
"(" + title.getLineNumber() + "): " +
title.getStringValue());
}
} else {
System.out.println("Verification failed");
}
}
// Helper method to get the first child of an element having a given name.
// If there is no child with the given name it returns null
private static XdmNode getChild(XdmNode parent, QName childName) {
XdmSequenceIterator iter = parent.axisIterator(Axis.CHILD, childName);
if (iter.hasNext()) {
return (XdmNode)iter.next();
} else {
return null;
}
}
}JAXP API是为XPath 1.0设计的,从未升级到处理模式感知查询等2.0概念。如果您使用的是Saxon,请使用s9api接口而不是JAXP 以下是saxon参考资料下载中s9apiExamples.java中的模式感知XPath示例:
/**
* Demonstrate use of a schema-aware XPath expression
*/
private static class XPathC implements S9APIExamples.Test {
public String name() {
return "XPathC";
}
public boolean needsSaxonEE() {
return true;
}
public void run() throws SaxonApiException {
Processor proc = new Processor(true);
SchemaManager sm = proc.getSchemaManager();
sm.load(new StreamSource(new File("data/books.xsd")));
SchemaValidator sv = sm.newSchemaValidator();
sv.setLax(false);
XPathCompiler xpath = proc.newXPathCompiler();
xpath.declareNamespace("saxon", "http://saxon.sf.net/"); // not actually used, just for demonstration
xpath.importSchemaNamespace(""); // import schema for the non-namespace
DocumentBuilder builder = proc.newDocumentBuilder();
builder.setLineNumbering(true);
builder.setWhitespaceStrippingPolicy(WhitespaceStrippingPolicy.ALL);
builder.setSchemaValidator(sv);
XdmNode booksDoc = builder.build(new File("data/books.xml"));
// find all the ITEM elements, and for each one display the TITLE child
XPathSelector verify = xpath.compile(". instance of document-node(schema-element(BOOKLIST))").load();
verify.setContextItem(booksDoc);
if (((XdmAtomicValue)verify.evaluateSingle()).getBooleanValue()) {
XPathSelector selector = xpath.compile("//schema-element(ITEM)").load();
selector.setContextItem(booksDoc);
QName titleName = new QName("TITLE");
for (XdmItem item: selector) {
XdmNode title = getChild((XdmNode)item, titleName);
System.out.println(title.getNodeName() +
"(" + title.getLineNumber() + "): " +
title.getStringValue());
}
} else {
System.out.println("Verification failed");
}
}
// Helper method to get the first child of an element having a given name.
// If there is no child with the given name it returns null
private static XdmNode getChild(XdmNode parent, QName childName) {
XdmSequenceIterator iter = parent.axisIterator(Axis.CHILD, childName);
if (iter.hasNext()) {
return (XdmNode)iter.next();
} else {
return null;
}
}
}如果您想用适当的类型表示元素并验证文档,请尝试JAXB。您甚至可以在几秒钟内从XML模式文档生成类。什么是类型感知查询和类型化数据?我只是对XPath略知一二,所以我不知道这些是什么意思。模式不应该与名称空间关联并在源XML文档中声明吗?@SteveH。模式文件的声明不一定是模式文件的位置。这是一种常见的做法,但不是必需的。@Tom我又看了一遍,但似乎JAXB不支持XPath。我遗漏了什么吗?如果您想用适当的类型表示元素并验证文档,请尝试JAXB。您甚至可以在几秒钟内从XML模式文档生成类。什么是类型感知查询和类型化数据?我只是对XPath略知一二,所以我不知道这些是什么意思。模式不应该与名称空间关联并在源XML文档中声明吗?@SteveH。模式文件的声明不一定是模式文件的位置。这是一种常见的做法,但不是必需的。@Tom我又看了一遍,但似乎JAXB不支持XPath。我遗漏了什么吗?XPath 1.0包含模式感知查询。dom4j/jaxen像.NET运行时一样执行此操作。我们目前使用dom4j/jaxen,它工作得很好,但我认为如果添加了标准Java运行时,我们应该切换到它。感谢daveNo,XPath 1.0不包括模式感知,除非您使用这个术语来表示与XPath 2.0规范使用它的方式完全不同的内容。我使用这个术语是因为dom4j/jaxen和Microsoft.NET库使用它。从模式中,它们将节点转换为指定类型,用于比较和从XPath查询返回类型化结果。XPath 1.0包括模式感知查询。dom4j/jaxen像.NET运行时一样执行此操作。我们目前使用dom4j/jaxen,它工作得很好,但我认为如果添加了标准Java运行时,我们应该切换到它。感谢daveNo,XPath 1.0不包括模式感知,除非您使用这个术语来表示与XPath 2.0规范使用它的方式完全不同的内容。我使用这个术语是因为dom4j/jaxen和Microsoft.NET库使用它。从模式中,它们将节点转换为指定类型,用于比较和从XPath查询返回类型化结果。