【问题标题】:Need help selecting values from XML file using SQL xQuery需要帮助使用 SQL xQuery 从 XML 文件中选择值
【发布时间】:2017-11-09 19:51:31
【问题描述】:

救命!

我有一个由 WinSCP 生成的 XML 日志文件,我想根据它的内容触发警报。我无法控制 XML 的格式。

我正在尝试使用 xQuery 读取值,但没有运气。我得到的只是 0 行的列标题。我也尝试过 OPENXML 和 VBA ImportXML,但是这两种方法都返回空值。

DECLARE @XML XML =
'<?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" name="ftpuser@ftphost.com" start="2017-11-09T18:00:09.051Z">
  <upload>
    <filename value="e:\MyUploadFile.txt" />
    <destination value="/HostFolder/MyUploadFile.txt" />
    <result success="true" />
  </upload>
  <touch>
    <filename value="/HostFolder/MyUploadFile.txt" />
    <modification value="2017-11-09T18:00:08.000Z" />
    <result success="true" />
  </touch>
</session>
'

SELECT
    Sess.Upload.value('../filename[1]','varchar(250)') [Filename]
    ,Sess.Upload.value('../destination[1]','varchar(250)') [Destination]
    ,Sess.Upload.value('../result[1]','varchar(250)')        [Result]

FROM
            @XML.nodes ('/session/upload')  AS Sess(Upload)

【问题讨论】:

    标签: sql xml tsql xquery winscp


    【解决方案1】:

    您是否操作过您的 XML?第二行的.../session/1.0name 后面少了一个引号。

    此 XML 有一个您必须声明的默认命名空间。我不知道,你期望的输出是什么,但我的魔法水晶球告诉我,它可能是这样的:

    DECLARE @XML XML =
    '<?xml version="1.0" encoding="UTF-8"?>
    <session xmlns="http://winscp.net/schema/session/1.0" name="ftpuser@ftphost.com" start="2017-11-09T18:00:09.051Z">
      <upload>
        <filename value="e:\MyUploadFile.txt" />
        <destination value="/HostFolder/MyUploadFile.txt" />
        <result success="true" />
      </upload>
      <touch>
        <filename value="/HostFolder/MyUploadFile.txt" />
        <modification value="2017-11-09T18:00:08.000Z" />
        <result success="true" />
      </touch>
    </session>
    ';
    
    WITH XMLNAMESPACES(DEFAULT 'http://winscp.net/schema/session/1.0')
    SELECT
         Sess.Upload.value('local-name(.)','nvarchar(max)') AS FileAction
        ,Sess.Upload.value('(filename/@value)[1]','varchar(250)') [Filename]
        ,Sess.Upload.value('(destination/@value)[1]','varchar(250)') [Destination]
        ,Sess.Upload.value('(modification/@value)[1]','varchar(250)') [Modification]
        ,Sess.Upload.value('(result/@success)[1]','varchar(250)')        [Result]
    
    FROM @XML.nodes ('/session/*')  AS Sess(Upload);
    

    【讨论】:

    • 在我发布的代码中,我确实更改了日志文件中的 xml 以删除凭据并意外删除了结尾引号。然而,这不是我的问题。 XML 命名空间声明解决了我的问题。谢谢!
    【解决方案2】:
    1. 您似乎在命名空间末尾省略了双引号,因此您的 XML 实际上是无效的。

    2. 你必须declare the namespace。喜欢:

      WITH XMLNAMESPACES (DEFAULT 'http://winscp.net/schema/session/1.0') 
      
    3. ../ 错误。应该是./

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多