草庐IT

java - 从 java 和 sql 查询生成 xml

coder 2024-06-28 原文

我正在使用以下查询:

SELECT inst.*
FROM
  (SELECT ROWNUM AS r,
    b.name INSTNAME,
    ICC.INSTITUTE_ID,
    ICC.COURSE_ID,
    c.name INSTCOURSE
  FROM INSTITUTE_COURSE_CATEGORY ICC,
    INSTITUTE a,
    MEMBER b,
    INSTITUTE_COURSE c
  WHERE ICC.CATEGORY_ID = 47
  AND ICC.INSTITUTE_ID  = a.id
  AND ICC.INSTITUTE_ID  = c.institute_id
  AND ICC.COURSE_ID     = c.id
  AND a.member_id       = b.id
  )inst
WHERE inst.r BETWEEN 1 AND 10

产生以下结果:

  R     INSTNAME                             INSTITUTE_ID   COURSE_ID   INSTCOURSE                                                                 
    1   Asia Pacific Institute Of Mangement     167           1134      Post Graduate Diploma in Management                                        
    2   Asia Pacific Institute Of Mangement     167           1135      Post Graduate Diploma in Management (Marketing)                      
    3   Asia Pacific Institute Of Mangement     167           1136      Post Graduate Diploma in Management (International Business)             
    4   Asia Pacific Institute Of Mangement     167           1138      Post Graduate Diploma in Management (Banking & Financial Services)   
    5   University of Delhi                     182           4283      Bachelor of Business Studies                                     
    6   University of Delhi                     182           4285      Bachelor of Commerce (Pass)                                      
    7   University of Delhi                     182           4291      Bachelor of Commerce (Honours)                                   
    8   University of Delhi                     182           4366      Master of Commerce                                           
    9   Acharya Narendra Dev College            183            812      B.Com. (Hons)                                                    
    10  Aditi Mahavidyalaya                     184            829      B.Com (Pass)                                  

根据上面的查询结果,我不得不在java中制作以下xml:

<Root>
  <INSTITUTE>
    <ID>167</ID>
    <NAME>Asia Pacific Instiute Of Mangement</Name>  
    <COURSES>
        <COURSE>
           <ID>1134</ID>
           <NAME>Post Graduate Diploma in Management</NAME>
        </COURSE>
         ..more
    </COURSES>
   </INSTITUTE>
    ..more
</Root>

例如:

There are 4 Courses that belongs to InstituteID(167). 

The problem I am facing is how to make 4 child nodes (Courses Nodes(1134,1135,1136,1138)) under a single `<INSTITUTE>`  node

随后将其他类(class)节点置于各自的节点下

<INSITUTE>

节点。

请提供建议...

最佳答案

您可以使用 Oracle 的 XMLQuery 功能一次性生成 XML。为了说明这一点,我首先通过创建四个表来模拟您的设置:

SQL> create table member (id,name)
  2  as
  3  select 1, 'Asia Pacific Institute Of Management' from dual union all
  4  select 2, 'University of Delhi' from dual union all
  5  select 3, 'Acharya Narendra Dev College' from dual union all
  6  select 4, 'Aditi Mahavidyalaya' from dual
  7  /

Table created.

SQL> create table institute (id, member_id)
  2  as
  3  select 167, 1 from dual union all
  4  select 182, 2 from dual union all
  5  select 183, 3 from dual union all
  6  select 184, 4 from dual
  7  /

Table created.

SQL> create table institute_course (id,institute_id,name)
  2  as
  3  select 1134, 167, 'Post Graduate Diploma in Management' from dual union all
  4  select 1135, 167, 'Post Graduate Diploma in Management (Marketing)' from dual union all
  5  select 1136, 167, 'Post Graduate Diploma in Management (International Business)' from dual union all
  6  select 1137, 167, 'Post Graduate Diploma in Management (Banking & Financial Services)' from dual union all
  7  select 4283, 182, 'Bachelor of Business Studies' from dual union all
  8  select 4285, 182, 'Bachelor of Commerce (Pass)' from dual union all
  9  select 4291, 182, 'Bachelor of Commerce (Honours)' from dual union all
 10  select 4366, 182, 'Master of Commerce' from dual union all
 11  select  812, 183, 'B.Com. (Hons)' from dual union all
 12  select  829, 184, 'B.Com (Pass)' from dual
 13  /

Table created.

SQL> create table institute_course_category (category_id,institute_id,course_id)
  2  as
  3  select 47, 167, 1134 from dual union all
  4  select 47, 167, 1135 from dual union all
  5  select 47, 167, 1136 from dual union all
  6  select 47, 167, 1137 from dual union all
  7  select 47, 182, 4283 from dual union all
  8  select 47, 182, 4285 from dual union all
  9  select 47, 182, 4291 from dual union all
 10  select 47, 182, 4366 from dual union all
 11  select 47, 183,  812 from dual union all
 12  select 47, 184,  829 from dual
 13  /

Table created.

我创建了这四个表,以便您的查询给出与您的问题相同的结果集:

SQL> SELECT inst.*
  2    FROM ( SELECT ROWNUM AS r
  3                , b.name INSTNAME
  4                , ICC.INSTITUTE_ID
  5                , ICC.COURSE_ID
  6                , c.name INSTCOURSE
  7             FROM INSTITUTE_COURSE_CATEGORY ICC
  8                , INSTITUTE a
  9                , MEMBER b
 10                , INSTITUTE_COURSE c
 11            WHERE ICC.CATEGORY_ID  = 47
 12              AND ICC.INSTITUTE_ID = a.id
 13              AND ICC.INSTITUTE_ID = c.institute_id
 14              AND ICC.COURSE_ID    = c.id
 15              AND a.member_id      = b.id
 16         ) inst
 17   WHERE inst.r BETWEEN 1 AND 10
 18  /

  R INSTNAME                             INSTITUTE_ID  COURSE_ID INSTCOURSE
--- ------------------------------------ ------------ ---------- ------------------------------------------------------------------
  1 Asia Pacific Institute Of Management          167       1137 Post Graduate Diploma in Management (Banking & Financial Services)
  2 Asia Pacific Institute Of Management          167       1136 Post Graduate Diploma in Management (International Business)
  3 Asia Pacific Institute Of Management          167       1135 Post Graduate Diploma in Management (Marketing)
  4 Asia Pacific Institute Of Management          167       1134 Post Graduate Diploma in Management
  5 University of Delhi                           182       4366 Master of Commerce
  6 University of Delhi                           182       4291 Bachelor of Commerce (Honours)
  7 University of Delhi                           182       4285 Bachelor of Commerce (Pass)
  8 University of Delhi                           182       4283 Bachelor of Business Studies
  9 Acharya Narendra Dev College                  183        812 B.Com. (Hons)
 10 Aditi Mahavidyalaya                           184        829 B.Com (Pass)

10 rows selected.

现在 XML 查询是:

SQL> select xmlelement
  2         ( "Root"
  3         , xmlelement
  4           ( "INSTITUTE"
  5           , xmlagg(xmlforest(id,name,courses))
  6           )
  7         ).extract('/') your_xml
  8    from ( select i.id
  9                , m.name
 10                , xmlagg
 11                  ( xmlelement
 12                    ( "COURSE"
 13                    , xmlforest(ic.id,ic.name)
 14                    )
 15                  ) courses
 16             from institute i
 17                  inner join member m on (i.member_id = m.id)
 18                  inner join institute_course ic on (ic.institute_id = i.id)
 19                  inner join institute_course_category icc on (icc.institute_id = ic.institute_id and icc.course_id = ic.id)
 20            where icc.category_id = 47
 21            group by i.id
 22                , m.name
 23         )
 24  /

YOUR_XML
--------------------------------------------------------------------------------------------------------------------------------------
<Root>
  <INSTITUTE>
    <ID>167</ID>
    <NAME>Asia Pacific Institute Of Management</NAME>
    <COURSES>
      <COURSE>
        <ID>1137</ID>
        <NAME>Post Graduate Diploma in Management (Banking &amp; Financial Services)</NAME>
      </COURSE>
      <COURSE>
        <ID>1136</ID>
        <NAME>Post Graduate Diploma in Management (International Business)</NAME>
      </COURSE>
      <COURSE>
        <ID>1135</ID>
        <NAME>Post Graduate Diploma in Management (Marketing)</NAME>
      </COURSE>
      <COURSE>
        <ID>1134</ID>
        <NAME>Post Graduate Diploma in Management</NAME>
      </COURSE>
    </COURSES>
    <ID>182</ID>
    <NAME>University of Delhi</NAME>
    <COURSES>
      <COURSE>
        <ID>4366</ID>
        <NAME>Master of Commerce</NAME>
      </COURSE>
      <COURSE>
        <ID>4291</ID>
        <NAME>Bachelor of Commerce (Honours)</NAME>
      </COURSE>
      <COURSE>
        <ID>4285</ID>
        <NAME>Bachelor of Commerce (Pass)</NAME>
      </COURSE>
      <COURSE>
        <ID>4283</ID>
        <NAME>Bachelor of Business Studies</NAME>
      </COURSE>
    </COURSES>
    <ID>183</ID>
    <NAME>Acharya Narendra Dev College</NAME>
    <COURSES>
      <COURSE>
        <ID>812</ID>
        <NAME>B.Com. (Hons)</NAME>
      </COURSE>
    </COURSES>
    <ID>184</ID>
    <NAME>Aditi Mahavidyalaya</NAME>
    <COURSES>
      <COURSE>
        <ID>829</ID>
        <NAME>B.Com (Pass)</NAME>
      </COURSE>
    </COURSES>
  </INSTITUTE>
</Root>


1 row selected.

这里是所用函数的文档:

XMLElement
XMLForest
XMLAgg

请注意,我使用 .extract('/') 只是为了美观。您可以将其关闭。

而且,由于您当前的查询只有两层深度,您可以使用下面的查询稍微缩短查询。但是,当您有两个以上的级别时,您将不得不使用可以轻松扩展的内联变体。

SQL> select xmlelement
  2         ( "Root"
  3         , xmlelement
  4           ( "INSTITUTE"
  5           , xmlagg
  6             ( xmlforest
  7               ( i.id
  8               , m.name
  9               , xmlagg
 10                 ( xmlelement
 11                   ( "COURSE"
 12                   , xmlforest(ic.id,ic.name)
 13                   )
 14                 ) as "COURSES"
 15               )
 16             )
 17           )
 18         ).extract('/') your_xml
 19    from institute i
 20         inner join member m on (i.member_id = m.id)
 21         inner join institute_course ic on (ic.institute_id = i.id)
 22         inner join institute_course_category icc on (icc.institute_id = ic.institute_id and icc.course_id = ic.id)
 23   where icc.category_id = 47
 24   group by i.id
 25       , m.name
 26  /

希望这对您有所帮助。

问候,
罗布。

关于java - 从 java 和 sql 查询生成 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077676/

有关java - 从 java 和 sql 查询生成 xml的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  3. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  6. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  7. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  8. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  9. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐