有两个XML文件,需要使用XQuery和Java进行查询
需要家庭作业方面的帮助。我有两个XML文件:Person.XML和passedExams.XML Person.xml表单->有两个XML文件,需要使用XQuery和Java进行查询,java,xml,xquery,Java,Xml,Xquery,需要家庭作业方面的帮助。我有两个XML文件:Person.XML和passedExams.XML Person.xml表单-> <listWrapper> <items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person"> <address>Random street 2, Neverland</address> <tel
<listWrapper>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random street 2, Neverland</address>
<telephoneNumber>555-1-612-9999</telephoneNumber>
<name>Captain</name>
<sid>35168589</sid>
<surname>Obvious</surname>
</items>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</listWrapper>
<listWrapper>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>BM3409</ExamID>
<sid>36431731</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>MV7402</ExamID>
<sid>36441189</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
</listWrapper>
梦幻岛随机街2号
555-1-612-9999
船长
35168589
明显的
梦幻岛随机大道
555-1-123-9999
盖布
36431731
纽厄尔
passedExams.xml表单->
<listWrapper>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random street 2, Neverland</address>
<telephoneNumber>555-1-612-9999</telephoneNumber>
<name>Captain</name>
<sid>35168589</sid>
<surname>Obvious</surname>
</items>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</listWrapper>
<listWrapper>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>BM3409</ExamID>
<sid>36431731</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>MV7402</ExamID>
<sid>36441189</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
</listWrapper>
BM3409
36431731
7.
4.
MV7402
36441189
7.
4.
使用这两个文件,我试图列出在一年中的y个月内通过x项考试的所有人。例如,在一年中的第10个月,让所有通过两次考试的人都来。我写一个好的查询有困难,因为我不擅长。到目前为止,我得到的是:
for $exam in doc("pasedExams.xml")/listWrapper//items[month = 1]
where $person in doc("Person.xml")/listWrapper/items[$exam/sid = $person/sid] satisfies (count($exam/sid) = 2)
return
<info>
$person
</info>
用于文档中的$exam(“pasedExams.xml”)/listWrapper//items[month=1]
其中,$person-in-doc(“person.xml”)/listWrapper/items[$exam/sid=$person/sid]满足(count($exam/sid)=2)
返回
$person
这里x=1和y=2仅用于演示。用户可以在程序启动时选择参数。为了澄清这背后的逻辑,我尝试迭代1月份的考试,然后尝试将考试中的SID(学生ID)与Person.xml中的SID(学生ID)进行匹配,然后计算SID在passedExams中出现的次数,因为SID出现的次数就是该学生通过的次数。当我在Stylus Studio中运行此命令时,在第2行第14列显示此错误:[DataDirect][XQuery][err:XPST0003]错误。预期的“回报”,但遇到“中”
我如何才能做到这一点?您的错误声明清楚地说明了代码中的语法错误。不能在where子句的构造中使用该
。
此外,您的FWLOR表达式并不表示您想要实现的目标:您想要输出所有用户,但您需要迭代每个检查,尽管这只是一个必需的条件。所以应该是这样的:
for $user in doc("Person.xml")/listWrapper/items
where count(doc("passedExams.xml")/listWrapper/items[id/sid = $user/sid and month = 1]) >= 2
return $user
我现在不知道,但我想,等级
也决定了这个人是否通过了axam考试,所以你可能需要另一个条件。你想要这样的东西吗:
let $numExams := 0,
$month := 1,
$Persons := doc("file:///c:/temp/delete/Person.xml"),
$PassedExams := doc("file:///c:/temp/delete/passedExams.xml")
return
for $p in $Persons/listWrapper/items
return
if($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]
[if($numExams gt 0)
then position() ge $numExams
else false()
]
or
$numExams le 0
and not($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]) )
then
(
<info>
{$p}
</info>
)
else ()
<info>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</info>
和经过更正和轻微修改的PassedExams.xml
:
<listWrapper>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random street 2, Neverland</address>
<telephoneNumber>555-1-612-9999</telephoneNumber>
<name>Captain</name>
<sid>35168589</sid>
<surname>Obvious</surname>
</items>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</listWrapper>
<listWrapper>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>BM3409</ExamID>
<sid>36431731</sid>
</id>
<month>1</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>MV7402</ExamID>
<sid>36441189</sid>
</id>
<month>7</month>
<grade>4</grade>
</items>
<items xsi:type="passedExams" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>
<ExamID>CL3102</ExamID>
<sid>36431731</sid>
</id>
<month>1</month>
<grade>4</grade>
</items>
</listWrapper>
BM3409
36431731
1.
4.
MV7402
36441189
7.
4.
CL3102
36431731
1.
4.
生成所需的正确结果:
let $numExams := 0,
$month := 1,
$Persons := doc("file:///c:/temp/delete/Person.xml"),
$PassedExams := doc("file:///c:/temp/delete/passedExams.xml")
return
for $p in $Persons/listWrapper/items
return
if($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]
[if($numExams gt 0)
then position() ge $numExams
else false()
]
or
$numExams le 0
and not($PassedExams/listWrapper/items
[xs:integer(month) eq $month and id/sid eq $p/sid]) )
then
(
<info>
{$p}
</info>
)
else ()
<info>
<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="person">
<address>Random avenue, Neverland</address>
<telephoneNumber>555-1-123-9999</telephoneNumber>
<name>Gabe</name>
<sid>36431731</sid>
<surname>Newell</surname>
</items>
</info>
梦幻岛随机大道
555-1-123-9999
盖布
36431731
纽厄尔
如果你问的是家庭作业,请明确说明。既然你已经“写了大部分代码”,请把它展示给我们,否则这个问题可能会被解决。通常,提供预期的示例输出(对于数量有限的输入节点)有助于避免误解。@Jens Erat Oh ok。是的,这是家庭作业。嗯,我编辑了这个问题,并尽我最大的努力解释这个问题,并介绍了我所拥有的。现在请看一看。下一个问题:请先检查您的问题是否有拼写错误和有效的XML!这使那些试图帮助你的人的生活变得更加轻松。@dirkk对不起,我不明白这些XML是如何无效的。我确实仔细检查了它们,但很难关注细节,因为我正在将它们从外语翻译成英语。@Larper:我修复了它们(例如,结尾缺失)。无需翻译XML,只需将其保留为原始语言-对查询没有任何影响。这不起作用,因为在第2行中,您正在Person.XML中搜索考试月份,但它位于passedExams.XML中(至少我认为这是原因)。我只是混淆了这两个文档,修复了它。谢谢,它几乎可以完美地工作。我注意到您使用了一个条件“>=2”,但我需要找到准确通过的学生,例如,2次考试,所以我猜在条件中需要“=2”?还有一件事,当搜索当月通过0次考试的学生时,该查询不起作用。如果一个人在该月通过了0次考试,那么他的SID不应该位于passedExams.xml的任何位置,其中月份等于我们要查找的月份。我试过了,但想不出任何能解决这个问题的修改。你能想出什么吗?关于=2
,你是对的。我不明白为什么查询应该与0一起工作。你所描述的正是where条件在做什么(计算这个特定用户和这个特定月份的考试次数,并将其与0进行比较)哇!很抱歉,在检查0次考试时,我似乎误解了什么,一切正常!非常感谢,谢谢你的回答。然而,它并没有发挥应有的作用。除了搜索在某个月内通过了0次考试的人之外,它似乎是有效的。这个查询列出了当月通过考试的人(它不会过滤掉他们)。如果一个人在某个月内没有通过考试,那么他的SID就不会出现在该月的passedExams.xml中。一个人如何过滤呢?(考虑到这些XML文件的结构,搜索某个月内通过0次考试的学生有意义吗?@Larper,请查看答案——现在更新。谢谢,这在Stylus Studio中也适用,但我选择接受@dirkk的答案,因为他的解决方案是用Java编写的。你的丢了这个。如果您想知道我的Java代码是什么样子的,并且可能对修复问题以供将来参考感兴趣,那么这就是我的建议。干杯@Larper,这是纯XQuery/XPath,不依赖于任何其他编程语言,如Java。德克的解决方案中也没有任何“Java”。这意味着t