Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有两个XML文件,需要使用XQuery和Java进行查询_Java_Xml_Xquery - Fatal编程技术网

有两个XML文件,需要使用XQuery和Java进行查询

有两个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

需要家庭作业方面的帮助。我有两个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>
      <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