2017-11-09 11 views
0

Help!SQL xQueryを使用してXMLファイルから値を選択する際にヘルプが必要

私はWinSCPによって生成されたXMLログファイルを持っています。その内容に基づいてアラートをトリガーしたいと思います。私はXMLがどのようにフォーマットされているかについては何のコントロールもしていません。

xQueryを使用して値を読み取ろうとしていますが、運がないです。私が得るのは、0行の列見出しだけです。 OPENXMLとVBA ImportXMLも試しましたが、どちらのメソッドもNULLを返します。

DECLARE @XML XML = 
'<?xml version="1.0" encoding="UTF-8"?> 
<session xmlns="http://winscp.net/schema/session/1.0" name="[email protected]" 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) 

答えて

0

XMLを操作しましたか? 2行目に.../session/1.0nameの後に見積もりがありません。

このXMLには、宣言する必要があるデフォルトの名前空間があります。それはあなたがの終わりに二重引用符を省略しているようだ

DECLARE @XML XML = 
'<?xml version="1.0" encoding="UTF-8"?> 
<session xmlns="http://winscp.net/schema/session/1.0" name="[email protected]" 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); 
+0

私が投稿したコードでは、ログファイルからxmlを変更して資格情報を削除し、誤って終了クォートを削除しました。しかし、それは私の問題ではありませんでした。 XML名前空間の宣言が私の問題を解決しました。ありがとう! – Dan

0
  1. :それはこのようなものかもしれないと、私はあなたが出力として期待するもの、知らないが、私の魔法の水晶玉は私に語りましたXMLは事実上無効です。

  2. declare the namespaceが必要です。 Like:

    WITH XMLNAMESPACES (DEFAULT 'http://winscp.net/schema/session/1.0') 
    
  3. ../が間違っています。それは./でなければなりません。

関連する問題