xpath: 前缀必须解析为命名空间
xpath: prefix must resolve to a namespace
下面是 SSIS 包的 XML 片段;我正在尝试编写 XPath 查询以从 SSIS 包中查找所有 "SELECT *" 语句。
我遇到错误
ERROR: Caused by: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: SQLTask
XML:
<DTS:Executable
DTS:refId="Package\TEST\TEST_COUNT"
<DTS:ObjectData>
<SQLTask:SqlTaskData
SQLTask:Connection="{F7343EC3-A89E-4236-962C-FD2EB8B9491E}"
SQLTask:SqlStatementSource="select * from dbo.TEST where colname1=? and colname2=?"
SQLTask:ResultType="ResultSetType_SingleRow" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask">
</SQLTask:SqlTaskData>
</DTS:ObjectData>
</DTS:Executable>
Xpath 查询:
//SQLTask:SqlTaskData[contains(translate(@SQLTask:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@DTS:refId
我能够从 https://www.freeformatter.com/xpath-tester.html 成功评估 xpath 表达式。但是,实际的包是通过 SonarQube 中定义的 XPath 规则进行验证的,我从那里得到了这个错误。
这是您的 XPath 查询,正如评论中指出的那样,它带有绕过的命名空间:
//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@*:refId
有关解释,请阅读 kjhughes excellent answer 。
现在,获取所有包含 "select *" 的 SqlStatementSource 的工作方式相同:
//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/@*:SqlStatementSource
或使用您已经发现的 local-name()
函数:
//*[local-name()='SqlTaskData'][contains(translate(@*[local-name()='SqlStatementSource'],'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select count(*)")]/@*[local-name()='SqlStatementSource']
下面是 SSIS 包的 XML 片段;我正在尝试编写 XPath 查询以从 SSIS 包中查找所有 "SELECT *" 语句。
我遇到错误
ERROR: Caused by: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace: SQLTask
XML:
<DTS:Executable
DTS:refId="Package\TEST\TEST_COUNT"
<DTS:ObjectData>
<SQLTask:SqlTaskData
SQLTask:Connection="{F7343EC3-A89E-4236-962C-FD2EB8B9491E}"
SQLTask:SqlStatementSource="select * from dbo.TEST where colname1=? and colname2=?"
SQLTask:ResultType="ResultSetType_SingleRow" xmlns:SQLTask="www.microsoft.com/sqlserver/dts/tasks/sqltask">
</SQLTask:SqlTaskData>
</DTS:ObjectData>
</DTS:Executable>
Xpath 查询:
//SQLTask:SqlTaskData[contains(translate(@SQLTask:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@DTS:refId
我能够从 https://www.freeformatter.com/xpath-tester.html 成功评估 xpath 表达式。但是,实际的包是通过 SonarQube 中定义的 XPath 规则进行验证的,我从那里得到了这个错误。
这是您的 XPath 查询,正如评论中指出的那样,它带有绕过的命名空间:
//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/../../@*:refId
有关解释,请阅读 kjhughes excellent answer
现在,获取所有包含 "select *" 的 SqlStatementSource 的工作方式相同:
//*:SqlTaskData[contains(translate(@*:SqlStatementSource,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select *")]/@*:SqlStatementSource
或使用您已经发现的 local-name()
函数:
//*[local-name()='SqlTaskData'][contains(translate(@*[local-name()='SqlStatementSource'],'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') ,"select count(*)")]/@*[local-name()='SqlStatementSource']