Oracle XMLQuery 正在破坏命名空间

2024-03-18

甲骨文版本11.2

下面是我在 XMLType 列上运行的 XMLQuery 的简化版本。当我运行查询时,它只是解析并重新创建存储的 XML、tsxm 命名空间 (不等于默认命名空间) 被改变。该查询不执行任何操作,并且可以轻松重写,但真正的(更大的)查询使用相同的方法,因此这就是我以这种格式发布问题的原因。如果我将 tsxm 命名空间定义更改为与默认命名空间相同:

xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsip"

那么问题就消失了,但在实际应用中这是不可能的。

创建表:

CREATE TABLE XML_DOCUMENT_TMP
(
  DOCUMENT_ID   NUMBER(12)                      NOT NULL,
  XML_DATA      SYS.XMLTYPE                     NOT NULL,
  CREATED_DATE  TIMESTAMP(6)                    NOT NULL
);

插入一些数据:

insert into XML_DOCUMENT_TMP
(document_id,created_date,xml_data)
values(1,sysdate,'<patent  xmlns="http://schemas.thomson.com/ts/20041221/tsip" 
xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" 
xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsxm"  
tsip:action="replace" tsip:cc="CA" tsip:se="2715340" tsip:ki="C">
<accessions tsip:action="replace">
    <accession tsip:src="wila" tsip:type="key">CA-2715340-C</accession>
    <accession tsip:src="tscm" tsip:type="tscmKey">CA-2715340-C-20150804</accession>
</accessions>
<claimed tsip:action="replace">
    <claimsTsxm tsip:lang="en">
        <tsxm:heading tsxm:align="left">We Claim:</tsxm:heading>
        <claimTsxm tsip:no="1" tsxm:num="1" tsip:type="main">1.  power.</claimTsxm>
    </claimsTsxm>
</claimed>

');

运行 XML 查询:

WITH tmpTable AS (
SELECT * FROM XML_DOCUMENT_TMP cm )
SELECT tt.xml_data ,
XMLQuery('declare default element namespace  "http://schemas.thomson.com/ts/20041221/tsip";
      declare namespace  tsip="http://schemas.thomson.com/ts/20041221/tsip";
      declare namespace  tsxm="http://schemas.thomson.com/ts/20041221/tsxm"; 

      let $patsLus := $m/patent/*

      return          
      <patent>{$m/patent/@*}
      {
        for $i in $m/patent/*
            return    $i
      }
      </patent>' 
            PASSING tt.xml_data as "m"   RETURNING CONTENT) newXml 
 FROM tmpTable tt
 WHERE tt.document_id in (1);

Returns:

<patent xmlns="http://schemas.thomson.com/ts/20041221/tsip"    xmlns:syspfx_AT="http://schemas.thomson.com/ts/20041221/tsip" syspfx_AT:action="replace" syspfx_AT:cc="CA" syspfx_AT:se="2715340" syspfx_AT:ki="C"><accessions xmlns="http://schemas.thomson.com/ts/20041221/tsip" action="replace">
<accession src="wila" type="key">CA-2715340-C</accession>
<accession src="tscm" type="tscmKey">CA-2715340-C-20150804</accession>
</accessions>
<claimed xmlns="http://schemas.thomson.com/ts/20041221/tsip" action="replace">
<claimsTsxm lang="en">
<syspfx_1:heading xmlns:syspfx_1="http://schemas.thomson.com/ts/20041221/tsxm" syspfx_1:align="left">We Claim:</syspfx_1:heading>
<claimTsxm no="1" xmlns:syspfx_1="http://schemas.thomson.com/ts/20041221/tsxm" syspfx_1:num="1" type="main">1.  power.</claimTsxm>
</claimsTsxm>
</claimed>
</patent>

那么,问题是,是什么导致 tsxm 命名空间声明更改为 syspfx_AT 并将 tsxm 命名空间前缀更改为 xmlns:syspfx_1?

任何想法都非常感激。


据报道,这似乎是预期的行为我的 Oracle 支持 https://support.oracle.com/文档 ID 2060374.1。但从一些实验看来,在 XPath 中使用通配符命名空间似乎可以阻止这种情况的发生;所以:

  <patent>{$m/*:patent/@*}
  {
    for $i in $m/*:patent/*
        return    $i
  }
  </patent>' 

使用您的原始数据(在 11.2.0.4 中),并对其进行序列化以使其格式更具可读性:

 WITH tmpTable AS (
SELECT * FROM XML_DOCUMENT_TMP cm )
SELECT tt.xml_data ,
XMLSerialize(DOCUMENT
XMLQuery('declare default element namespace  "http://schemas.thomson.com/ts/20041221/tsip";
      declare namespace  tsip="http://schemas.thomson.com/ts/20041221/tsip";
      declare namespace  tsxm="http://schemas.thomson.com/ts/20041221/tsxm";

      let $patsLus := $m/patent/*

      return          
      <patent>{$m/*:patent/@*}
      {
        for $i in $m/*:patent/*
            return    $i
      }
      </patent>' 
            PASSING tt.xml_data as "m"   RETURNING CONTENT)
 AS VARCHAR2(4000) INDENT SIZE = 2) ewXml 
 FROM tmpTable tt
 WHERE tt.document_id in (1);

XML_DATA
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NEWXML
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<patent xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsxm" tsip:action="replace" tsip:cc="CA" tsip:se="2715340" tsi
p:ki="C">
  <accessions tsip:action="replace">
    <accession tsip:src="wila" tsip:type="key">CA-2715340-C</accession>
    <accession tsip:src="tscm" tsip:type="tscmKey">CA-2715340-C-20150804</accession>
  </accessions>
  <claimed tsip:action="replace">
    <claimsTsxm tsip:lang="en">
      <tsxm:heading tsxm:align="left">We Claim:</tsxm:heading>
      <claimTsxm tsip:no="1" tsxm:num="1" tsip:type="main">1.  power.</claimTsxm>
    </claimsTsxm>
  </claimed>
</patent>
<patent xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace" tsip:cc="CA" tsip:se="2715340" tsip:ki="C">                                                
  <accessions xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace">                                                                                     
    <accession tsip:src="wila" tsip:type="key">CA-2715340-C</accession>                                                                                                                                                               
    <accession tsip:src="tscm" tsip:type="tscmKey">CA-2715340-C-20150804</accession>                                                                                                                                                  
  </accessions>                                                                                                                                                                                                                       
  <claimed xmlns="http://schemas.thomson.com/ts/20041221/tsip" xmlns:tsip="http://schemas.thomson.com/ts/20041221/tsip" tsip:action="replace">                                                                                        
    <claimsTsxm tsip:lang="en">                                                                                                                                                                                                       
      <tsxm:heading xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsxm" tsxm:align="left">We Claim:</tsxm:heading>                                                                                                               
      <claimTsxm tsip:no="1" xmlns:tsxm="http://schemas.thomson.com/ts/20041221/tsxm" tsxm:num="1" tsip:type="main">1.  power.</claimTsxm>                                                                                            
    </claimsTsxm>                                                                                                                                                                                                                     
  </claimed>                                                                                                                                                                                                                          
</patent>                                                                                                                                                                                                                             

这与您的原始版本不同,但不再有名称空间损坏。您是否可以在实际查询中执行此操作,以及通配符是否会导致任何问题,则是另一回事......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle XMLQuery 正在破坏命名空间 的相关文章

随机推荐

  • Neo4j 索引创建失败

    我目前正在了解 Neo4j 和图形数据库的功能 我还做了neo4j附带的电影教程 现在我必须处理一个大型数据库 135 GB 500 个 mio nodes 950 个 mio relationships 并且想要为特殊类型的节点添加索引
  • 为什么 this 不能作为成员函数中的默认参数传递?

    我试图将当前的 le ngth 值作为默认参数作为函数参数传递 但编译器显示错误 在此上下文中不得使用 this 谁能告诉我我犯了什么错误 class A private int length public A void display i
  • 在node.js中,全局对象(或头对象)有名称吗?

    如果环境是浏览器 那么我们可以使用 测试this关键字指向window对象 也是全局对象 或者有些书称其为 头对象 如果在node js中 有没有类似这样的名字呢 window 以便 console log this globalObjec
  • 确定线斜率变化的位置(算法)

    如果你绘制下面的数字 你会得到一个 波动性微笑 数字遵循一个线性斜率 左斜率 然后更改为 遵循另一个线性斜率 右斜率 我有几组这样的数据 想知道斜率在哪里 变化 笔记 斜率变化通常发生在点之间 不知道有多少个点有左斜率 有多少个有 正确的斜
  • java 如何打开另一个目录中的文件?

    如何打开不在当前目录中但在另一个目录中的文件 例如 我有一个文件夹 F test 我的文件位于 F test test2 doit txt 和 D test3 doit2 txt 创建文件对象时在参数路径中输入的内容如下 File f ne
  • XSLT - 将前同级元素与当前节点元素进行比较

    我有这个 XML 文件
  • JavaFX 如何滚动 ScrollPane 以使节点位于视口中间?

    我必须创建显示当前时间的时间线 我正在使用 AnchorPane 并将添加的行放置在 ScrollPane 中 我需要模拟1天 滚动窗格宽度为 2880px 每60px为一小时 我的限制是 前一天 12 小时 第二天 12 小时 移动我的线
  • 如何为BackgroundService传递参数?

    我阅读了有关 ASP net core 2 2 的内容 并找到了有关通用主机的参考资料 我尝试在示例下使用 backgroundService 创建控制台应用程序 https github com aspnet AspNetCore Doc
  • 一个值在数组中存在多少次[重复]

    这个问题在这里已经有答案了 我想做的第一件事是找出我在输入中输入的数字是否存在于数组中 这有效 我想做的第二件事是找出它存在的次数 我在这里走的路正确吗
  • 如何将 Flot 与 AngularJS 集成?

    我对 Angular 和 Flot 很陌生 但对 Jquery 和 Javascript 很熟悉 我对如何将 Flot 图表绑定到 Angular 数据模型有点困惑 因为 Flot 是一个 JQuery 插件 我四处搜寻 但未能找到示例 我
  • 库存管理数据库设计

    我正在为我的公司创建一个内部网 我们希望在其中进行库存管理 我们销售和租赁报警系统 我们希望很好地了解哪些产品仍在我们的办公室中 哪些产品已出租或出售 何时出租或出售等 目前我想到了这个数据库设计 每次我们创建新合同时 该合同都与地点或商品
  • 如何扩展Generator类?

    我尝试过滤生成器 并期望这种通用功能必须在 JavaScript 中的任何位置定义 因为它是为数组定义的 但我找不到它 所以我试图定义它 但我无法扩展内置发电机 我有一个示例生成器 function make nums let nums n
  • NSFetchRequest 未捕获属性已更改的对象

    我在 Mac Os X 10 6 上使用 SQL 存储时遇到了 Core Data 的奇怪问题 我有一个NSManagedObject子类称为Family有属性name和一段关系personList连接到另一个NSManagedObject
  • 必须从 UI 线程调用 getText() 方法

    必须从 UI 线程调用 getText 方法 请帮忙 我是 android studio 的初学者 在网上找到了这些代码 但无法弄清楚 我真的很感激 public class MainActivity extends AppCompatAc
  • Django password_reset 支持 html 电子邮件模板吗?

    在我看来 django 仅支持开箱即用的密码重置电子邮件的纯文本消息 我如何使用 html 模板来实现此目的 以下是如何进行覆盖 urls py url r user password reset YOUR APP views passwo
  • node.js - 代码保护?

    我想在下一个项目中使用node js 但我的老板不喜欢我们的竞争对手可以阅读源代码 有没有办法保护 JavaScript 代码 您可以使用 Node 的 NativeExtension 来完成此操作 你会有一个boostrap js为 js
  • 我如何能够在 C++ 中声明一个在运行时确定的可变长度数组?

    请检查这段代码 它编译并运行得非常好 问题是 当我开始学习 c turbo c 时 我从来无法将任何类型的数组声明为 datatype var variable set at runtime 我想当然地认为这在最新的 gcc 编译器中是不可
  • 如何根据优先级和关联性来解析(复杂)声明?

    符号 如 等 两者都使用表达式 and 声明 这是两个不同的概念 In 表达式 符号为运营商 为此我们有一个明确定义的优先级和结合性表 当表达比较复杂 我们可以利用这张表进行分解分析 例如 a b c Question In 声明 这些符号
  • 使用 Kinesis Analytics 构建实时会话

    是否有某个地方的示例 或者有人可以解释如何使用 Kinesis Analytics 构建实时会话 即会话化 这里提到这可能 https aws amazon com blogs aws amazon kinesis analytics pr
  • Oracle XMLQuery 正在破坏命名空间

    甲骨文版本11 2 下面是我在 XMLType 列上运行的 XMLQuery 的简化版本 当我运行查询时 它只是解析并重新创建存储的 XML tsxm 命名空间 不等于默认命名空间 被改变 该查询不执行任何操作 并且可以轻松重写 但真正的