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

时间:2013-05-18 09:57:45

标签: 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>
      <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>

passExams.xml表单 - &gt;

<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>

使用这两个文件我试图列出在一年中的某个月通过x考试的所有人。例如,获取在一年中的第10个月通过2门考试的所有人。我在写一个好的查询时遇到了麻烦,因为我对它不好。这是我到目前为止所得到的:

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>

此处x = 1且y = 2仅适用于演示。用户可以在程序启动时选择参数。为了澄清这背后的逻辑,我试图迭代1月份发生的考试,然后我试图将考试中的SID(学生ID)与Person.xml中的考试相匹配,然后我计算的数量SID在passExams中发生,因为SID的出现次数是该学生传递的测试次数。当我在Stylus Studio中运行时显示此错误: [DataDirect] [XQuery] [错误:XPST0003]第2行第14行出错。预期“返回”,但遇到“in”。 < / p>

我该如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您的错误声明清楚地说明了代码中的语法错误。您不能在where子句中使用该in构造。 此外,您的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

我现在不知道,但我猜这个grade也会确定这个人是否真的通过了axam,或者失败了,所以你可能需要另外一个条件。

答案 1 :(得分:1)

你想要这样的东西

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 ()

当使用提供的Person.xml(从几个畸形中纠正)应用此XQuery(以及纯XPath 3.0表达式)时:

<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>

以及经过纠正和略微修改后的PassedExams.xml

<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>

产生了想要的正确结果

<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>