我对XQL很陌生,最近在这里研究了XQL Joins(XML文档上的联接):-http://www.ibiblio.org/xql/xql-proposal.html#Joins。我只是想知道,如果我想在JAVA中实现XQL Join,我该如何使用JAVA来实现呢?
Join是XQL的一个新功能。我尝试在XQuery中搜索XQLJoin示例,在JAVA中搜索XPathAPI,但(到目前为止)还没有找到任何支持XQLJoin的内容。
XQL联接的示例如下:-
假设我们有一个图书来源和一个评论来源:-
<book>
<isbn> 84-7169-020-9 </isbn>
<title> Tales of the Alhambra </title>
<author> Washington Irving </author>
</book>
<review>
<isbn> 84-7169-020-9 </isbn>
<title> Tales of the Alhambra </title>
<reviewer> Ricardo Sanchez </reviewer>
<comments>
A romantic and humorous account of the time that
the author of "The Legend of Sleepy Hollow" lived
in an Arabian palace in Spain.
</comments>
</review>
我们可能想将这些结合起来,创建一个包括评论中的评论的书籍视图:
<book>
<isbn> 84-7169-020-9 </isbn>
<title> Tales of the Alhambra </title>
<author> Washington Irving </author>
<review>
<reviewer> Ricardo Sanchez </reviewer>
<comments>
A romantic and humorous account of the time that
the author of "The Legend of Sleepy Hollow" lived
in an Arabian palace in Spain.
</comments>
</review>
</book>
为了实现这一点,我们可以编写以下XQL查询:-
/book[isbn][$i:=isbn] {
$i | title | author
| //review[isbn=$i] { reviewer | comments }
}
虽然我还没有在JAVA中的XPath和XQueryAPI中找到任何这样的支持,但仍然为了尝试,我使用XPathJAVA API进行了同样的尝试。详细信息如下:-
XML保存在一个测试文件(books.txt)中,该文件包含以下数据:-
<?xml version="1.0"?>
<catalog>
<book>
<isbn>0470192747</isbn>
<author>Kay, Michael</author>
<title>XSLT 2.0 and XPath 2.0 (4th Edition)</title>
<genre>Computer</genre>
<price>33.99</price>
<publish_date>2008-06-03</publish_date>
<description>This book is primarily a practical reference
book for professional XSLT developers.</description>
</book>
<book>
<isbn>0596006349</isbn>
<author>Walmsley, Priscilla</author>
<title>XQuery</title>
<genre>Computer</genre>
<price>38.50</price>
<publish_date>2007-03-30</publish_date>
<description>This in-depth tutorial not only walks you through
the XQuery specification, but also teaches you how to program with
this widely anticipated query language.</description>
</book>
<book>
<isbn>059652112X</isbn>
<author>Kalin, Martin</author>
<title>Java Web Services: Up and Running</title>
<genre>Computer</genre>
<price>26.99</price>
<publish_date>2009-02-23</publish_date>
<description>With this example-driven book, you get a quick, practical,
and thorough introduction to Java's API for XML Web Services (JAX-WS)
and the Java API for RESTful Web Services (JAX-RS).</description>
</book>
<book>
<isbn>0321356683</isbn>
<author>Bloch, Joshua</author>
<title>Effective Java (2nd Edition)</title>
<genre>Computer</genre>
<price>35.99</price>
<publish_date>2008-05-22</publish_date>
<description>Presents the most practical, authoritative guidelines
available for writing efficient,well-designed programs.</description>
</book>
<book>
<isbn>0141014865</isbn>
<author>de Botton, Alain</author>
<title>Status Anxiety</title>
<genre>Philosophy</genre>
<price>9.99</price>
<publish_date>2005-01-13</publish_date>
<description>The author presents a universal condition of which
many of us suffer from called Status Anxiety, investigates it's
origins and possible solutions.</description>
</book>
<book>
<isbn>0201771861</isbn>
<author>Rusty Harold, Elliotte</author>
<title>Processing XML with Java (SAX, DOM, JDOM, JAXP & TrAX)</title>
<genre>Computer</genre>
<price>37.99</price>
<publish_date>2002-11-14</publish_date>
<description>Handing and processing XML in
the Java programming language.</description>
</book>
<book>
<isbn>1887521143</isbn>
<author>Poomsan Becker, Benjawan</author>
<title>Thai-English and English-Thai Dictionary</title>
<genre>Dictionary</genre>
<price>14.95</price>
<publish_date>2005-04-30</publish_date>
<description>With Transliteration for Non-Thai Speakers -
Complete with Thai Alphabet Guide</description>
</book>
<book>
<isbn>0415071771</isbn>
<author>Jung, Carl Gustav</author>
<title>Psychological Types</title>
<genre>Psychology</genre>
<price>19.99</price>
<publish_date>1992-01-02</publish_date>
<description>Essential reading for anyone requiring a proper
understanding of Jung's psychology, this was the work in which Jung
set out his theory of psychological types as a means of understanding
ourselves and the world around us.</description>
</book>
<book>
<isbn>0596003552</isbn>
<author>Pawson, Dave</author>
<title>XSL-FO: Making XML Look Good in Print</title>
<genre>Computer</genre>
<price>26.99</price>
<publish_date>2002-08-19</publish_date>
<description>Outlines XSL FO's strengths and weaknesses, provides
a tutorial and reference guide.</description>
</book>
<book>
<isbn>0321392795</isbn>
<author>Gray, Simon</author>
<title>Data Structures in Java</title>
<genre>Computer</genre>
<price>53.99</price>
<publish_date>2006-11-13</publish_date>
<description>From Abstract Data Types to the
Java Collections Framework.</description>
</book>
<review>
<isbn>0321392795</isbn>
<title> Tales of the Alhambra </title>
<reviewer> Ricardo Sanchez </reviewer>
<comments>
A romantic and humorous account of the time that
the author of "The Legend of Sleepy Hollow" lived
in an Arabian palace in Spain.
</comments>
</review>
</catalog>
实现的JAVA代码如下:-
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
public class XQLJoin {
public static void main(String[] args) {
try {
File inputFile = new File("books.txt");
DocumentBuilderFactory dbFactory
= DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(inputFile);
doc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/catalog/book[isbn][$i:=isbn] { $i | title | author | //review[isbn=$i] { reviewer | comments }}";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
Node nNode = nodeList.item(i);
System.out.println("nCurrent Element :"
+ nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
System.out.println("Title : "
+ eElement
.getElementsByTagName("title")
.item(0)
.getTextContent());
System.out.println("Reviewer : "
+ eElement
.getElementsByTagName("reviewer")
.item(0)
.getTextContent());
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
}
上面的代码引发了一个异常,其中包含以下堆栈:-
javax.xml.transform.TransformerException: Expected ], but found: isbn
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
at XQLJoin.main(XQLJoin.java:36)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Expected ], but found: isbn
at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(Unknown Source)
at XQLJoin.main(XQLJoin.java:36)
Caused by: javax.xml.transform.TransformerException: Expected ], but found: isbn
at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(Unknown Source)
at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
at com.sun.org.apache.xpath.internal.XPath.<init>(Unknown Source)
... 2 more
请建议如何使用Java实现此功能。有线索吗?
首先让我们从XQL开始;XQL已经过时了,据我所知,目前还没有实现,我相信XQL是XQuery的前置器,所以你应该从XQuery3.1开始,而不是担心XQL。
也就是说,XQuery缺少XQL中描述的显式联接。XQuery确实具有创建联接的功能,但不存在结果的隐式合并。您可以使用以下三种方法中的一种来明确合并结果:
- XQueryUpdate获取第一个查询的结果并插入联接的结果
- 对第一个查询的结果进行身份转换,注入联接的结果
- 使用元素构造函数输出所需的XML形状,并将查询放入该结构中(如下所示)
上面代码的问题是XPath无效,这正是您收到的错误告诉您的,即[$i:=isbn]
是最初的问题,但{{
部分也不是有效的XPath或XQuery。
对于XQuery表达式,我将为初学者介绍一种更简单的方法(即上面的选项3):
<catalog>
{
for $book in /catalog/book
let $reviews := /catalog/review[isbn eq $book/isbn]
return
<book>
{
$book/*,
for $review in $reviews
return
<review>
{
$review/(reviewer | comments)
}
</review>
}
</book>
}
</catalog>
这将产生以下输出(来自您在问题中描述的源文档):
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book>
<isbn>0470192747</isbn>
<author>Kay, Michael</author>
<title>XSLT 2.0 and XPath 2.0 (4th Edition)</title>
<genre>Computer</genre>
<price>33.99</price>
<publish_date>2008-06-03</publish_date>
<description>This book is primarily a practical reference
book for professional XSLT developers.</description>
</book>
<book>
<isbn>0596006349</isbn>
<author>Walmsley, Priscilla</author>
<title>XQuery</title>
<genre>Computer</genre>
<price>38.50</price>
<publish_date>2007-03-30</publish_date>
<description>This in-depth tutorial not only walks you through
the XQuery specification, but also teaches you how to program with
this widely anticipated query language.</description>
</book>
<book>
<isbn>059652112X</isbn>
<author>Kalin, Martin</author>
<title>Java Web Services: Up and Running</title>
<genre>Computer</genre>
<price>26.99</price>
<publish_date>2009-02-23</publish_date>
<description>With this example-driven book, you get a quick, practical,
and thorough introduction to Java's API for XML Web Services (JAX-WS)
and the Java API for RESTful Web Services (JAX-RS).</description>
</book>
<book>
<isbn>0321356683</isbn>
<author>Bloch, Joshua</author>
<title>Effective Java (2nd Edition)</title>
<genre>Computer</genre>
<price>35.99</price>
<publish_date>2008-05-22</publish_date>
<description>Presents the most practical, authoritative guidelines
available for writing efficient,well-designed programs.</description>
</book>
<book>
<isbn>0141014865</isbn>
<author>de Botton, Alain</author>
<title>Status Anxiety</title>
<genre>Philosophy</genre>
<price>9.99</price>
<publish_date>2005-01-13</publish_date>
<description>The author presents a universal condition of which
many of us suffer from called Status Anxiety, investigates it's
origins and possible solutions.</description>
</book>
<book>
<isbn>0201771861</isbn>
<author>Rusty Harold, Elliotte</author>
<title>Processing XML with Java (SAX, DOM, JDOM, JAXP & TrAX)</title>
<genre>Computer</genre>
<price>37.99</price>
<publish_date>2002-11-14</publish_date>
<description>Handing and processing XML in
the Java programming language.</description>
</book>
<book>
<isbn>1887521143</isbn>
<author>Poomsan Becker, Benjawan</author>
<title>Thai-English and English-Thai Dictionary</title>
<genre>Dictionary</genre>
<price>14.95</price>
<publish_date>2005-04-30</publish_date>
<description>With Transliteration for Non-Thai Speakers -
Complete with Thai Alphabet Guide</description>
</book>
<book>
<isbn>0415071771</isbn>
<author>Jung, Carl Gustav</author>
<title>Psychological Types</title>
<genre>Psychology</genre>
<price>19.99</price>
<publish_date>1992-01-02</publish_date>
<description>Essential reading for anyone requiring a proper
understanding of Jung's psychology, this was the work in which Jung
set out his theory of psychological types as a means of understanding
ourselves and the world around us.</description>
</book>
<book>
<isbn>0596003552</isbn>
<author>Pawson, Dave</author>
<title>XSL-FO: Making XML Look Good in Print</title>
<genre>Computer</genre>
<price>26.99</price>
<publish_date>2002-08-19</publish_date>
<description>Outlines XSL FO's strengths and weaknesses, provides
a tutorial and reference guide.</description>
</book>
<book>
<isbn>0321392795</isbn>
<author>Gray, Simon</author>
<title>Data Structures in Java</title>
<genre>Computer</genre>
<price>53.99</price>
<publish_date>2006-11-13</publish_date>
<description>From Abstract Data Types to the
Java Collections Framework.</description>
<review>
<reviewer> Ricardo Sanchez </reviewer>
<comments>
A romantic and humorous account of the time that
the author of "The Legend of Sleepy Hollow" lived
in an Arabian palace in Spain.
</comments>
</review>
</book>
</catalog>
如果您将其用作上面的expression
,那么您应该可以执行以下操作:-)