【问题标题】:How to return a column from XML using Oracle XMLTABLE如何使用 Oracle XMLTABLE 从 XML 返回列
【发布时间】:2017-12-06 18:11:30
【问题描述】:

我有一些XML 存储在一个表中。我需要能够接受这个XML 并提取某些值。

我已经编写了一些代码来尝试返回<ns1:Int32/> 标记的值,但到目前为止我还不能返回结果。

我在网上找到了几个使用 XMLTABLE 函数的示例,但不幸的是,其中很多示例都使用了比我更简单的 XML

XML

<Rule Priority="0" Description="Description 1" Active="True" ReevaluationBehavior="Always" Name="Name 1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
    <Rule.Condition>
        <RuleExpressionCondition Name="{p3:Null}" xmlns:p3="http://schemas.microsoft.com/winfx/2006/xaml">
            <RuleExpressionCondition.Expression>
                <ns0:CodeBinaryOperatorExpression Operator="BooleanAnd" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                    <ns0:CodeBinaryOperatorExpression.Right>
                        <ns0:CodeBinaryOperatorExpression Operator="GreaterThanOrEqual">
                            <ns0:CodeBinaryOperatorExpression.Right>
                                <ns0:CodePrimitiveExpression>
                                    <ns0:CodePrimitiveExpression.Value>
                                        <ns1:Int32 xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">11</ns1:Int32>
                                    </ns0:CodePrimitiveExpression.Value>
                                </ns0:CodePrimitiveExpression>
                            </ns0:CodeBinaryOperatorExpression.Right>
                        </ns0:CodeBinaryOperatorExpression>
                    </ns0:CodeBinaryOperatorExpression.Right>
                </ns0:CodeBinaryOperatorExpression>
            </RuleExpressionCondition.Expression>
        </RuleExpressionCondition>
    </Rule.Condition>
</Rule>

SQL

SELECT Rules2.*
FROM RULES Rules1,
XMLTABLE
(
    XMLNAMESPACES
    (
        'http://schemas.microsoft.com/winfx/2006/xaml' AS "p3",
        'clr-namespace:System;Assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' AS "ns0",
        'clr-namespace:System;Assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' AS "ns1",
        DEFAULT 'http://schemas.microsoft.com/winfx/2006/xaml/workflow'
    )
    ,
    '/Rule/RuleExpressionCondition/CodeBinaryOperatorExpression/CodePrimitiveExpression'
    PASSING XMLPARSE(CONTENT Rules1.RULE WELLFORMED)
    COLUMNS "Int" INT PATH 'ns1:Int32'
) 
Rules2
;

非常感谢任何帮助。

【问题讨论】:

  • “标签”的值是什么意思?你的意思是值 11?
  • 是的,在这个例子中我的意思是 11。

标签: sql xml oracle xmltable


【解决方案1】:

ns0 的命名空间定义中的 url 错误。并且 xmltable 中的路径错误。您可以使用短版本。或提供完整路径。 /Rule/Rule.Condition/RuleExpressionCondition/RuleExpressionCondition.Expression/ns0:CodeBinaryOperatorExpression/ns0:CodeBinaryOperatorExpression.Right/ns0:CodeBinaryOperatorExpression/ns0:CodeBinaryOperatorExpression.Right/ns0:CodePrimitiveExpression/ns0:CodePrimitiveExpression.Value

SELECT Rules2.*
FROM xmls Rules1,
XMLTABLE
(
    XMLNAMESPACES
    (
        'http://schemas.microsoft.com/winfx/2006/xaml' AS "p3",
        'clr-namespace:System.CodeDom;Assembly=System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' AS "ns0",
        'clr-namespace:System;Assembly=mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' AS "ns1",
        DEFAULT 'http://schemas.microsoft.com/winfx/2006/xaml/workflow'
    )
    ,
    '//ns0:CodePrimitiveExpression.Value'
    PASSING XMLPARSE(CONTENT Rules1.RULE WELLFORMED)
    COLUMNS "Int" INT PATH 'ns1:Int32'
) 
Rules2

【讨论】:

  • 使用短版本(带有'//'会导致性能下降。除非您正在搜索递归结构,否则应避免使用'//'
【解决方案2】:

我认为问题在于您的搜索表达式是

/Rule/RuleExpressionCondition/CodeBinaryOperatorExpression/CodePrimitiveExpression.

表达式缺少多个节点,对吧?

【讨论】:

    猜你喜欢
    • 2014-08-14
    • 2017-04-13
    • 2016-04-28
    • 2020-04-29
    • 1970-01-01
    • 2017-06-01
    • 2019-07-22
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多