草庐IT

sql - 将映射的 XPath 表达式转换为包含关系数据的 XML

coder 2024-06-27 原文

关闭。这个问题是 off-topic 。它目前不接受答案。












想改善这个问题吗? Update the question 所以它是堆栈溢出的 on-topic

8年前关闭。




Improve this question




背景

使用 XML 和 XSL 创建网站。 PostgreSQL 数据库的结构是为了表示必需的 XML 文档。 PostgreSQL 提供了许多与 XML 相关的函数,列在:

http://www.postgresql.org/docs/current/static/functions-xml.html

这是一个不同于从 XML 到数据库的问题,其中有很多解决方案。

更新: 澄清一下, 这个问题不需要使用给定 URL 中列出的 XML 函数 。它涉及基于将数据库表(和 JOIN 条件)映射到 XPath 表达式来创建 XML 文档的通用解决方案。

更新: 进一步说明,XQuery 用于搜索 XML 文档,就好像它们是一个数据库一样——就像 XPath 和 SQL 之间的交叉。我有一个数据库,我想生成一个 XML 文档。 XML 文档的结构应该根据映射到表和列的 XPath 表达式给出,而不是根据 XML 函数。

问题

我想解决的问题是使用 PostgreSQL 将表行中的值映射到 XPath 值。下面的例子用来说明这个问题。

例子

这个问题所涉及的 XPath 映射类似于:

root               > people
person             > person
person.first_name -> name/first
person.last_name  -> name/last
person.age        -> [@age]
account.person_id => person.person_id
account            > person/account
account.number    -> [@id]
PERSON 表可能类似于:
person_id | first_name | last_name | age
      123 | Peter      | Parker    | 18
      456 | James      | Jameson   | 42
ACCOUNT 表可能类似于:
account_id | person_id | number
         1 |       123 | 123456789

使用 XPath 映射查询数据库将生成以下 XML 文档:
<people>
  <person age="18">
    <name>
      <first>Peter</first>
      <last>Parker</last>
    </name>
    <account id="123456789" />
  </person>
  <person age="42">
    <name>
      <first>James</first>
      <last>Jameson</last>
    </name>
  </person>
</people>

在这种情况下,James Jameson 没有帐户,因此最终文档中不包含相应的 XML 元素 (account)。

这是一个难题,不需要完整的解决方案。处理映射到简单 XML 元素和属性的 80% 的简单表的解决方案就足够了。



您将如何创建基于数据库表(和一些 JOIN 操作)到 XPath(或类似操作)的映射返回 XML 文档的 SQL 语句(或过程)以执行数据转换?

是否有任何技术或开源实现已经执行此类任务?

谢谢!

相关链接

文章和白皮书
  • http://www.ibm.com/developerworks/library/x-query2xml/
  • http://www.thinkmind.org/download.php?articleid=dbkda_2011_6_20_30152
  • http://www.informatica.si/PDF/33-3/06_Naser%20-%20Two-Way%20Mapping%20between%20Object-Oriented%20Databases%20and%20XML.pdf
  • http://www.stylusstudio.com/sqlxml_tutorial.html

  • 商业软件
  • http://www.stylusstudio.com/db_to_xml_mapper.html
  • http://www.altova.com/mapforce.html
  • 最佳答案

    它应该使用一个xml生成函数

    postgres=# select xmlelement(name "people", xmlagg(xmlelement(name "person", xmlattributes(age), xmlforest(first_name as first, last_name as last)))) from person;
                                                                          xmlelement                                                                      
    ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
     <people><person age="18"><first>Peter</first><last>Parker</last></person><person age="42"><first>James</first><last>Jameson</last></person></people>
    

    (1 行)

    还有其他可能的用途
    postgres=# select table_to_xml('person', true, false, '');
                              table_to_xml                          
    ────────────────────────────────────────────────────────────────
     <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">↵
                                                                   ↵
     <row>                                                         ↵
       <first_name>Peter</first_name>                              ↵
       <last_name>Parker</last_name>                               ↵
       <age>18</age>                                               ↵
     </row>                                                        ↵
                                                                   ↵
     <row>                                                         ↵
       <first_name>James</first_name>                              ↵
       <last_name>Jameson</last_name>                              ↵
       <age>42</age>                                               ↵
     </row>                                                        ↵
                                                                   ↵
     </person>                                                     ↵
    
    (1 row)
    

    下一步应该是一些 xslt 转换到您的目标格式 - 这里将有更好的 xslt 专家,应该会有所帮助

    关于sql - 将映射的 XPath 表达式转换为包含关系数据的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8641602/

    有关sql - 将映射的 XPath 表达式转换为包含关系数据的 XML的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    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 - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

      为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

    5. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

      在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

    6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

      我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

    7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

      有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

    8. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

      我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

    9. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

      我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

    10. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

      我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

    随机推荐