Differences

This shows you the differences between the selected revisions of the page.

logging_xml 2009-04-14 logging_xml 2024-12-02 (current)
Line 1: Line 1:
====== XML Logging ====== ====== XML Logging ======
-XML logging is one of the WinSCP [[logging|log formats]]. XML log includes structured records describing operations done by WinSCP over session. The log format is protocol independent.+XML logging is one of the WinSCP [[logging|log formats]]. An %%XML%% log includes structured records describing operations done by WinSCP over session. The log format is protocol independent.
-===== Purpose =====+In many cases you do not have to deal with the %%XML%% log file directly. [[library|WinSCP .NET assembly]] can do it for you. 
 + 
 +===== [[purpose]] Purpose =====
Primary purpose of the XML logging is to provide machine-readable description of automatically performed operations, such as when using [[scripting|scripting]]. Primary purpose of the XML logging is to provide machine-readable description of automatically performed operations, such as when using [[scripting|scripting]].
-XML logging is useful e.g. to: +The %%XML%% logging is useful e.g. to: 
-  * Find a list of files that were actually uploaded/downloaded, when transferring whole directory or files matching a mask; +  * Find a list of files that were actually uploaded/downloaded, when transferring a whole directory or when transferring files matching a mask; 
-  * Get directory listing;+  * Get a directory listing;
  * Record operations done during [[task_synchronize_full|synchronization]].   * Record operations done during [[task_synchronize_full|synchronization]].
-The XML logging is not intended for detection, if batch of operations (such as script file) succeeded or not. See [[logging_xml#result|below]].+Note that while the %%XML%% logging can be used also for GUI sessions, it does not record [[transfer_queue|background transfers]].
-===== Using ===== +===== [[using]] Using ===== 
-XML logging is mostly useful with [[logging|logging to file]] only. Overall format of the XML log file follows:+The %%XML%% logging, being used along with [[scripting|scripting]], is most typically enabled from command-line, using ''[[commandline#logging|/xmllog]]'' parameter. It can be enabled in [[ui_pref_logging|preferences]] too. 
 + 
 +An overall format of the %%XML%% log file follows:
<code xml> <code xml>
Line 23: Line 27:
</code> </code>
-The top level ''session'' tag represents one logical session, which may consist of several physical sessions, particularly when connection is lost. Attribute ''name'' refers to name of the logical session. Attribute ''start'' indicates time when the session was initiated·((All timestamps in XML log have XML ''dateTime'' type, where only ''YYYY-MM-DD"T"HH:MM:SS.NNN"Z"'' syntax is used.)).+The top level ''session'' tag represents one logical session, which may consist of several physical sessions, particularly when connection is lost. Attribute ''name'' refers to name of the logical session. Attribute ''start'' indicates time when the session was initiated.((All timestamps in the %%XML%% log have %%XML%% ''dateTime'' type, where only ''%%YYYY-MM-DD"T"HH:MM:SS.NNN"Z"%%'' syntax is used.))
-The ''session'' element includes [[logging_xml#elements|child elements]], where each element represents single log entry, i.e. single physical operation with remote file over the logical session+The ''session'' element includes [[#elements|child elements]], where each element represents single log entry, i.e. single physical operation with remote file over the logical session.
- +
-To parse the XML log, use any XML parser available. See guide to [[guide_automation_advanced|advanced scripting]] to learn how to use Windows script host to parse XML log.+
===== [[operations]] Representing Operations in Log ===== ===== [[operations]] Representing Operations in Log =====
-Every entry in XML log represents single physical operation over the session. Typically this would be an operation with remote file.+Every entry in the %%XML%% log represents single physical operation over the session. Typically this would be an operation with remote file.
Single logical operation (in [[scripting|scripting]] or GUI) may actually involve multiple physical operations, each represented with separate log element. For example [[task_upload|upload]] of file (e.g. using ''put'' scripting command) may be represented by up to three elements, ''upload'' for actual upload, ''touch'' for preserving timestamp and ''chmod'' for preserving permissions. Single logical operation (in [[scripting|scripting]] or GUI) may actually involve multiple physical operations, each represented with separate log element. For example [[task_upload|upload]] of file (e.g. using ''put'' scripting command) may be represented by up to three elements, ''upload'' for actual upload, ''touch'' for preserving timestamp and ''chmod'' for preserving permissions.
-Note that some logical operations does not have corresponding log element (e.g. [[task_link|creation of symbolic link]]). Such operations are omitted from the XML log. +Note that some logical operations does not have corresponding log element (e.g. [[task_link|creation of symbolic link]]). Such operations are omitted from the %%XML%% log.
- +
-===== [[result]] Representing Results/Errors of Operations ===== +
-First, note that the XML logging is not intended for detection, if batch of operations (such as script file) succeeded or not. +
- +
-When checking for outcome of batch execution, you need check positively for presence of operations you have executed. Absence of errors does not indicate success. Note, when using scripting, checking WinSCP [[scripting#using_scripting|exit code]] is the only ultimate way to detect errors. +
- +
-XML log may not include some errors, even if they occur, for two reasons: +
-  * The operation that failed does not have corresponding log element (see [[logging_xml#operations|above]]). +
-  * The error is not associated with particular physical operation. Simple example is authentication failure. More treacherous example is failure to list remote directory, to find list of files it contains, while downloading the directory. This error occurs during download operation, which is logged. But as download of individual files is logged only, the error is not associated with download of any particular file. So it will be absent from the XML log.+
-With some protocols, each of the physical operations are performed individually. With some protocols, set of operations may be performed in atomic form. This may prevent mapping error to specific operation. In this case the error may be associated with more operations, resulting in its duplication in the XML log.+===== [[result]] Representing Results/Errors =====
-Result of an operation is represented by child ''result'' element of respective operation element. The ''result'' element has boolean ''success'' attribute.+==== Results/Errors of Operations ==== 
 +Result of a specific operation is represented by child ''result'' element of respective operation element. The ''result'' element has boolean ''success'' attribute.·
<code xml> <code xml>
Line 66: Line 60:
</code> </code>
-===== Elements ===== +With some protocols, each of the physical operations are performed individually. With some protocols, set of operations may be performed in atomic form. This may prevent mapping error to specific operation. In this case the error may be associated with more operations, resulting in its duplication in the %%XML%% log. 
-All operation elements below have ''[[logging_xml#result|result]]'' child element in addition to listed child elements.+ 
 +Some errors may not be associated with any operation in the XML log. This particularly happens when: 
 +  * An error is actually not associated with particular physical operation. Example is invalid script command syntax. 
 +  * The particular operation that failed does not have corresponding log element.  
 + 
 +==== [[result_script]] Results/Errors of Script ==== 
 +When the script fails (WinSCP [[scripting#using_scripting|exit code]] is 1), the top level ''session'' element or ''group'' element (when [[#group|grouping]] is enabled) will include one or more ''failure'' elements, each containing one or more ''message'' elements with error message(s). 
 + 
 +If the particular error was associated with a physical operation, the error message will be included both in ''result'' child element of the respective operation element and in ''failure'' child element of top level ''session'' element or ''group'' element. 
 + 
 +<code xml> 
 +<upload> 
 +  <filename value="d:\examplefile.txt" /> 
 +  <result success="false"> 
 +    <message>Cannot create remote file '/home/user/examplefile.txt'.</message> 
 +    <message>Permission denied. 
 +Error code: 3 
 +Error message from server: Permission denied 
 +Request code: 3</message> 
 +  </result> 
 +</upload> 
 +<failure> 
 +  <message>Cannot create remote file '/home/user/examplefile.txt'.</message> 
 +  <message>Permission denied. 
 +Error code: 3 
 +Error message from server: Permission denied 
 +Request code: 3</message> 
 +</failure> 
 +</code> 
 + 
 +===== [[group]] Grouping Operations for Commands ===== 
 +When using the %%XML%% logging together with [[scripting|scripting]], [[#elements|operations]] and [[#result_script|failures]] belonging to the same command can be grouped using parent ''group'' element: 
 + 
 +<code xml> 
 +<group name="put -preservetime d:\*.txt" start="2021-12-03T14:25:10.204Z"> 
 +  <upload> 
 +    <filename value="d:\readme.txt" /> 
 +    <destination value="/home/user/readme.txt" /> 
 +    <size value="15345" /> 
 +    <result success="true" /> 
 +  </upload> 
 +  <upload> 
 +    <filename value="d:\examplefile.txt" /> 
 +    <result success="false"> 
 +      <message>Cannot create remote file '/home/user/examplefile.txt'.</message> 
 +      <message>Permission denied. 
 +Error code: 3 
 +Error message from server: Permission denied 
 +Request code: 3</message> 
 +    </result> 
 +  </upload> 
 +  <failure> 
 +    <message>Cannot create remote file '/home/user/examplefile.txt'.</message> 
 +    <message>Permission denied. 
 +Error code: 3 
 +Error message from server: Permission denied 
 +Request code: 3</message> 
 +  </failure> 
 +</group> 
 +</code> 
 + 
 +Grouping can be enabled on [[commandline#scripting|command-line]]. 
 + 
 +//Grouping is particularly useful, when you are [[guide_interpreting_xml_log#continuous|continuously reading the XML log file]]. By receiving ''</group>'' you know that the command execution has finished.// 
 + 
 +===== [[elements]] Elements ===== 
 +All operation elements below have ''[[#result|result]]'' child element in addition to listed child elements.
The ''result'' child element is always present. Many other child elements may be absent in case of error. The ''result'' child element is always present. Many other child elements may be absent in case of error.
-==== call ====+==== [[call]] call ====
Execution of arbitrary [[remote_command|remote shell command]] (with [[protocols|SFTP and SCP protocols]]) or execution of a protocol command (with FTP protocol). Execution of arbitrary [[remote_command|remote shell command]] (with [[protocols|SFTP and SCP protocols]]) or execution of a protocol command (with FTP protocol).
Line 86: Line 146:
  <command value="ps" />   <command value="ps" />
  <destination value="/home/user" />   <destination value="/home/user" />
-····<output value="  PID TTY          TIME CMD+··<output value="  PID TTY          TIME CMD
16969 ?        00:00:00 sshd 16969 ?        00:00:00 sshd
16970 ?        00:00:00 sftp-server 16970 ?        00:00:00 sftp-server
32647 ?        00:00:00 bash 32647 ?        00:00:00 bash
1466 ?        00:00:00 ps" /> 1466 ?        00:00:00 ps" />
-····<result success="true" /> +··<result success="true" /> 
-··</call>+</call>
</code> </code>
-Associated script commands: ''[[script_commands#call|call]]''+Associated script commands: ''[[scriptcommand_call|call]]''
-==== chmod ====+==== [[checksum]] checksum ==== 
 +[[ui_properties#checksum|Calculating a checksum]] of a remote file.  
 + 
 +Elements: 
 +^ Element                  ^ Description ^ 
 +| ''filename''            | Absolute path to a remote file (in ''value'' attribute) | 
 +| ''algorithm''            | Name of a checksum algorithm used (in ''value'' attribute) | 
 +| ''checksum''            | Hex dump of a calculated checksum (in ''value'' attribute) | 
 + 
 +Example: 
 +<code xml> 
 +<checksum> 
 +  <filename value="/home/martin/public_html/index.html" /> 
 +  <algorithm value="sha-1" /> 
 +  <checksum value="bb4dfa9b51d3f6c99b5ec6c12ebf9cade79f43c4" /> 
 +  <result success="true" /> 
 +</checksum> 
 +</code> 
 + 
 +Associated script commands: ''[[scriptcommand_checksum|checksum]]'' 
 + 
 +==== [[chmod]] chmod ====
[[task_properties|Changing of permissions]] of one (or more) remote file. [[task_properties|Changing of permissions]] of one (or more) remote file.
Line 103: Line 184:
^ Element                  ^ Description ^ ^ Element                  ^ Description ^
| ''filename''            | Absolute path to remote file (in ''value'' attribute) | | ''filename''            | Absolute path to remote file (in ''value'' attribute) |
-| ''permissions''          | Permissions in Unix format ''rwxrwxrwx'' |+| ''permissions''          | Permissions in Unix format ''rwxrwxrwx'' (in ''value'' attribute) |
-With [[protocols#scp|SCP protocol]] optional boolean attribute ''recursive'' indicates, if permissions were changed recursively with single operation.+With [[scp|SCP protocol]] optional boolean attribute ''recursive'' indicates, if permissions were changed recursively with single operation.
Example: Example:
Line 113: Line 194:
  <permissions value="rwxr-xr-x" />   <permissions value="rwxr-xr-x" />
  <result success="true" />   <result success="true" />
-</touch>+</chmod> 
 +</code> 
 + 
 +Associated script commands: ''[[scriptcommand_chmod|chmod]]'', ''[[scriptcommand_keepuptodate|keepuptodate]] -permissions'', ''[[scriptcommand_put|put]] -permissions'', ''[[scriptcommand_synchronize|synchronize]] remote|both -permissions'' 
 + 
 +==== [[cp]] cp ==== 
 +[[task_move_duplicate#duplicate|Duplication]] of one remote file or directory. 
 + 
 +Elements: 
 +^ Element                  ^ Description ^ 
 +| ''filename''            | Absolute path to source local file (in ''value'' attribute) | 
 +| ''destination''          | Absolute path to destination remote file (in ''value'' attribute) | 
 + 
 +Example: 
 +<code xml> 
 +<cp> 
 +  <filename value="/home/martin/public_html/about.html" /> 
 +  <destination value="/home/martin/backup/about.html.20171220" /> 
 +  <result success="true" /> 
 +</cp>
</code> </code>
-Associated script commands: ''[[script_commands#chmod|chmod]]'', ''[[script_commands#keepuptodate|keepuptodate]] -permissions'', ''[[script_commands#put|put]] -permissions'', ''[[script_commands#synchronize|synchronize]] remote|both -permissions''+Associated script commands: ''[[scriptcommand_cp|cp]]''
-==== download ====+==== [[download]] download ====
[[task_download|Downloading]] of single file. [[task_download|Downloading]] of single file.
Line 125: Line 225:
| ''filename''            | Absolute path to source remote file (in ''value'' attribute) | | ''filename''            | Absolute path to source remote file (in ''value'' attribute) |
| ''destination''          | Absolute path to destination local file (in ''value'' attribute)((File name may differ from name of source file.)) | | ''destination''          | Absolute path to destination local file (in ''value'' attribute)((File name may differ from name of source file.)) |
 +| ''size''                | Number of bytes transferred. |
Example: Example:
Line 131: Line 232:
  <filename value="/home/martin/public_html/about.html" />   <filename value="/home/martin/public_html/about.html" />
  <destination value="d:\www\about.htm" />   <destination value="d:\www\about.htm" />
 +  <size value="55387" />
  <result success="true" />   <result success="true" />
-</upload>+</download>
</code> </code>
-Associated script commands: ''[[script_commands#get|get]]'', ''[[script_commands#synchronize|synchronize]] local|both''+Associated script commands: ''[[scriptcommand_get|get]]'', ''[[scriptcommand_synchronize|synchronize]] local|both''
-==== ls ==== +==== [[ls]] ls ==== 
-Listing of remote directory (only when explicitly requested using ''[[script_commands#ls|ls]]'' scripting command).+Listing of remote directory (only when explicitly requested using ''[[scriptcommand_ls|ls]]'' scripting command).
Elements: Elements:
Line 150: Line 252:
| ''type''                | Type of file as in Unix ''ls'' command output, e.g. ''d'' for directory (in ''value'' attribute) | | ''type''                | Type of file as in Unix ''ls'' command output, e.g. ''d'' for directory (in ''value'' attribute) |
| ''size''                | Size of file in bytes (in ''value'' attribute) | | ''size''                | Size of file in bytes (in ''value'' attribute) |
-| ''modification''        | Modification timestamp (in ''value'' attribute)((All timestamps in XML log have XML ''dateTime'' type, where only ''YYYY-MM-DD"T"HH:MM:SS.NNN"Z"'' syntax is used.)) |+| ''modification''        | Modification timestamp (in ''value'' attribute)((All timestamps in the %%XML%% log have %%XML%% ''dateTime'' type, where only ''%%YYYY-MM-DD"T"HH:MM:SS.NNN"Z"%%'' syntax is used.)) |
| ''permissions''          | File permissions in Unix format ''rwxrwxrwx'' (in ''value'' attribute) | | ''permissions''          | File permissions in Unix format ''rwxrwxrwx'' (in ''value'' attribute) |
 +| ''owner''                | File owner (in ''value'' attribute) |
 +| ''group''                | File group (in ''value'' attribute) |
Example: Example:
Line 189: Line 293:
</code> </code>
-Associated script commands: ''[[script_commands#ls|ls]]''+Associated script commands: ''[[scriptcommand_ls|ls]]''
-==== mkdir ====+==== [[mkdir]] mkdir ====
[[task_create_directory|Creating of remote directory]]. [[task_create_directory|Creating of remote directory]].
Line 203: Line 307:
  <filename value="/home/martin/public_html/images" />   <filename value="/home/martin/public_html/images" />
  <result success="true" />   <result success="true" />
-</upload>+</mkdir>
</code> </code>
-Associated script commands: ''[[script_commands#keepuptodate|keepuptodate]]'', ''[[script_commands#mkdir|mkdir]]'', ''[[script_commands#put|put]]'', ''[[script_commands#synchronize|synchronize]] remote|both''+Associated script commands: ''[[scriptcommand_keepuptodate|keepuptodate]]'', ''[[scriptcommand_mkdir|mkdir]]'', ''[[scriptcommand_put|put]]'', ''[[scriptcommand_synchronize|synchronize]] remote|both''
-==== mv ==== +==== [[mv]] mv ==== 
-[[task_move_duplicate#move|Moving]] or of one remote file or directory to different remote directory or [[task_rename|renaming]] of one remote file or directory.+[[task_move_duplicate#move|Moving]] of one remote file or directory to different remote directory or [[task_rename|renaming]] of one remote file or directory.
Elements: Elements:
Line 225: Line 329:
</code> </code>
-Associated script commands: ''[[script_commands#mv|mv]]''+Associated script commands: ''[[scriptcommand_mv|mv]]''
-==== rm ====+==== [[rm]] rm ====
[[task_delete|Deleting]] of one (or more) remote file or directory. [[task_delete|Deleting]] of one (or more) remote file or directory.
Line 234: Line 338:
| ''filename''            | Absolute path to remote file of directory (in ''value'' attribute) | | ''filename''            | Absolute path to remote file of directory (in ''value'' attribute) |
-With [[protocols#scp|SCP protocol]] optional boolean attribute ''recursive'' indicates, if remote directory was recursively deleted with all contained files with single operation.+With [[scp|SCP protocol]] optional boolean attribute ''recursive'' indicates, if remote directory was recursively deleted with all contained files with single operation.
Example: Example:
Line 244: Line 348:
</code> </code>
-Associated script commands: ''[[script_commands#get|get]] -delete'', ''[[script_commands#keepuptodate|keepuptodate]] -delete'', ''[[script_commands#rm|rm]]'', ''[[script_commands#rmdir|rmdir]]'', ''[[script_commands#synchronize|synchronize]] local|both -delete''+Associated script commands: ''[[scriptcommand_get|get]] -delete'', ''[[scriptcommand_keepuptodate|keepuptodate]] -delete'', ''[[scriptcommand_rm|rm]]'', ''[[scriptcommand_rmdir|rmdir]]'', ''[[scriptcommand_synchronize|synchronize]] local|both -delete''
-==== upload ====+==== [[stat]] stat ==== 
 +Listing of remote file attributes. 
 + 
 +Elements: 
 +^ Element                  ^ Description ^ 
 +| ''filename''            | Absolute path to remote file (in ''value'' attribute) | 
 +| ''file''                | Container of file attributes. See specification in description of ''[[#ls|ls]]'' element. Note that ''file'' element within ''stat'' misses ''filename'' subelement, comparing to ''file'' element within ''ls''/''files''. | 
 + 
 +Example: 
 +<code xml> 
 +<stat> 
 +  <filename value="/home/martin/public_html/about.html" /> 
 +  <file> 
 +    <type value="-" /> 
 +    <size value="24064" /> 
 +    <modification value="2007-10-04T21:43:02.000Z" /> 
 +    <permissions value="rw-r--r--" /> 
 +  </file> 
 +  <result success="true" /> 
 +</stat> 
 +</code> 
 + 
 +Associated script commands: ''[[scriptcommand_stat|stat]]'' 
 + 
 +==== [[upload]] upload ====
[[task_upload|Uploading]] of single file. [[task_upload|Uploading]] of single file.
Line 253: Line 381:
| ''filename''            | Absolute path to source local file (in ''value'' attribute) | | ''filename''            | Absolute path to source local file (in ''value'' attribute) |
| ''destination''          | Absolute path to destination remote file (in ''value'' attribute)((File name may differ from name of source file.)) | | ''destination''          | Absolute path to destination remote file (in ''value'' attribute)((File name may differ from name of source file.)) |
 +| ''size''                | Number of bytes transferred. |
Example: Example:
Line 259: Line 388:
  <filename value="d:\www\about.htm" />   <filename value="d:\www\about.htm" />
  <destination value="/home/martin/public_html/about.html" />   <destination value="/home/martin/public_html/about.html" />
 +  <size value="55387" />
  <result success="true" />   <result success="true" />
</upload> </upload>
</code> </code>
-Associated script commands: ''[[script_commands#keepuptodate|keepuptodate]]'', ''[[script_commands#put|put]]'', ''[[script_commands#synchronize|synchronize]] remote|both''+Associated script commands: ''[[scriptcommand_keepuptodate|keepuptodate]]'', ''[[scriptcommand_put|put]]'', ''[[scriptcommand_synchronize|synchronize]] remote|both''
-==== touch ====+==== [[touch]] touch ====
Changing of remote file timestamp. Changing of remote file timestamp.
Line 271: Line 401:
^ Element                  ^ Description ^ ^ Element                  ^ Description ^
| ''filename''            | Absolute path to remote file (in ''value'' attribute) | | ''filename''            | Absolute path to remote file (in ''value'' attribute) |
-| ''modification''        | Modification timestamp (in ''value'' attribute)((All timestamps in XML log have XML ''dateTime'' type, where only ''YYYY-MM-DD"T"HH:MM:SS.NNN"Z"'' syntax is used.)) |+| ''modification''        | Modification timestamp (in ''value'' attribute)((All timestamps in the %%XML%% log have %%XML%% ''dateTime'' type, where only ''%%YYYY-MM-DD"T"HH:MM:SS.NNN"Z"%%'' syntax is used.)) |
Example: Example:
Line 282: Line 412:
</code> </code>
-Associated script commands: ''[[script_commands#keepuptodate|keepuptodate]]'', ''[[script_commands#put|put]] -preservetime'', ''[[script_commands#synchronize|synchronize]] remote|both''+Associated script commands: ''[[scriptcommand_keepuptodate|keepuptodate]]'', ''[[scriptcommand_put|put]] -preservetime'', ''[[scriptcommand_synchronize|synchronize]] remote|both''
===== Schema ===== ===== Schema =====
-XML schema for the XML log is available at:+An %%XML%% schema for the %%XML%% log is available at:
http://winscp.net/schema/session/1.0 http://winscp.net/schema/session/1.0
===== Example ===== ===== Example =====
 +//Note that the ''[[#group|group]]'' elements will be included, if enabled only.//
 +
<code xml> <code xml>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<session xmlns="http://winscp.net/schema/session/1.0" <session xmlns="http://winscp.net/schema/session/1.0"
-        name="martin@example.com" start="2009-03-02T19:34:57.734Z"> +        name="martin@example.com" start="2012-01-04T14:25:53.173Z"> 
-  <upload+  <group name="put -preservetime -permissions=644 d:\www\about.htm" start="2012-01-04T14:28:45.393Z"
-    <filename value="d:\www\about.htm" /> +    <upload> 
- ···<destination value="/home/martin/public_html/about.html" /> +······<filename value="d:\www\about.htm" /> 
- ···<result success="true" /> + ·····<destination value="/home/martin/public_html/about.html" /> 
- ·</upload> + ·····<result success="true" /> 
- ·<touch> + ···</upload> 
- ···<filename value="/home/martin/public_html/about.html" /> + ···<touch> 
- ···<modification value="2008-12-28T11:22:19.000Z" /> + ·····<filename value="/home/martin/public_html/about.html" /> 
- ···<result success="true" /> + ·····<modification value="2008-12-28T11:22:19.000Z" /> 
- ·</touch> + ·····<result success="true" /> 
- ·<chmod> + ···</touch> 
- ···<filename value="/home/martin/public_html/about.html" /> + ···<chmod> 
- ···<permissions value="rw-r--r--" /> + ·····<filename value="/home/martin/public_html/about.html" /> 
- ···<result success="true" /> + ·····<permissions value="rw-r--r--" /> 
- ·</chmod> + ·····<result success="true" /> 
-  <rm> + ···</chmod> 
-    <filename value="/home/martin/public_html/about.bak" /> +  <;/group> 
- ···<result success="false">+  <group name=";rm about.bak" start="2012-01-04T14:28:47.892Z"
 +    <rm> 
 +······<filename value="/home/martin/public_html/about.bak" /> 
 + ·····<result success="false"
 +        <message>No such file or directory. 
 +Error code: 2 
 +Error message from server: No such file 
 +Request code: 13</message> 
 +      </result> 
 +    </rm> 
 +    <failure>
      <message>No such file or directory.       <message>No such file or directory.
Error code: 2 Error code: 2
Error message from server: No such file Error message from server: No such file
Request code: 13</message> Request code: 13</message>
-    </result+    </failure
-  </rm>+  </group>
</session> </session>
</code> </code>
 +===== [[parse]] Interpreting/Parsing =====
 +
 +==== General ====
 +To parse the %%XML%% log, use any %%XML%% parser available.
 +
 +If possible, using [[library|WinSCP .NET assembly]] is the preferred approach, which hides away the %%XML%% log file from your application.
 +
 +If you want to parse the XML log yourself anyway, see following guides to learn how to do that in different development environments:
 +  * [[guide_automation_advanced|*]] (Windows script host; Java or VB script);
 +  * [[guide_dotnet|*]] (.NET; C# or VB.NET);
 +  * [[guide_interpreting_xml_log|*]] (.NET, C#).
 +
 +==== [[xslt]] Transforming XML Log to Text Output Using XSLT Transformation ====
 +You can use XSLT transformation to convert the %%XML%% log to plain text output (or any other format).
 +
 +For example to generate a plain text list of successfully downloaded files from the following %%XML%% log (''log.xml''):
 +
 +<code xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<session xmlns="http://winscp.net/schema/session/1.0" name="user@host" start="2021-12-03T06:45:57.008Z">
 +  <download>
 +    <filename value="/path/file1.txt" />
 +    <destination value="C:\path\file1.txt" />
 +    <size value="2022" />
 +    <result success="true" />
 +  </download>
 +  <download>
 +    <filename value="/path/file2.txt" />
 +    <destination value="C:\path\file2.txt" />
 +    <size value="5782" />
 +    <result success="true" />
 +  </download>
 +</session>
 +</code>
 +
 +use the following %%XSLT%% (''download.xslt''):
 +
 +<code xml>
 +<?xml version="1.0" encoding="UTF-8"?>
 +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:winscp="http://winscp.net/schema/session/1.0">
 +    <xsl:output method="text" encoding="UTF-8"/>
 +    <xsl:strip-space elements="*"/>
 +    <xsl:template match='winscp:download[winscp:result[@success="true"]]/winscp:filename'>
 +        <xsl:value-of select="@value"/>
 +        <xsl:text>&#xa;</xsl:text>
 +    </xsl:template>
 +</xsl:stylesheet>
 +</code>
 +
 +You can execute it using any %%XSLT%% processor:
 +
 +  * .NET [[dotnet>system.xml.xsl.xslcompiledtransform|''XslCompiledTransform'' class]], e.g. from PowerShell: \\ <code powershell>
 +$xslt = New-Object System.Xml.Xsl.XslCompiledTransform
 +$xslt.Load("download.xslt")
 +$xslt.Transform("log.xml", "download.txt")</code>
 +  * [[https://gitlab.gnome.org/GNOME/libxml2/-/wikis/home|Libxml2]] ''xsltproc.exe'': \\ <code>
 +xsltproc.exe download.xslt log.xml
 +</code>
 +
 +The output will be:
 +
 +<code>
 +/path/file1.txt
 +/path/file2.txt
 +</code>
 +
 +For a more complex example, see [[script_custom_listing_format_csv#scripting|*]].

Last modified: by martin