STAX XML 解析

转载 2013年12月02日 15:13:07

利用stax xml文件可以提交Job给staf执行。下面结合具体实例讲述XML如何编写。

1 STAX基本的Job模板

1: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2: <!DOCTYPE stax SYSTEM "stax.dtd">
3:
4: <stax>
5:
6: <defaultcall function="main"/>
7:
8: <function name="main">
9: <nop/>
10: </function>
11:

12: </stax>

第一行和第二行一般都是一样的,每一个stax Job以stax标签开头。function 元素是Job中的主要的结构化机制,仅仅能stax根目录进行定义。defaultcall用来定义当Job提交的时候被调用的函数。nop是个空元素,表示什么都不做。


2利用stax启动notepad

1: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2: <!DOCTYPE stax SYSTEM "stax.dtd">
3:
4: <stax>
5:
6: <defaultcall function="main"/>
7:
8: <function name="main">
9:
10: <process>
11: <location>'local'</location>
12: <command>'notepad'</command>
13: </process>
14:
15: </function>
16:
17: </stax>


process元素:包含两个子元素location和command,其中location用来申明任务执行的机器,可以是本地的机器也可以是远程的机器,如果是远程的机器,必须在staf的配置文件中申明安全等级为5.本地直接用local表示。command为执行的具体命令,两个元素的值都用单引号,表示为Python的字符串。


上述实例是用来打开notepad的job。利用STAF Monitor可以用来提交job以及检测执行。

首先启动STAX检测器:C:\STAF\services\stax>java -jar STAXMon.jar


选择"文件"->"提交新任务",在出现的界面中选择需要提交的job对应的XML文件,并设置相关job的名称,然后提交即可




3 stafcmd

<stafcmd>
    <location>'local'</location>
    <service>'delay'</service>
    <request>'delay 30000'</request>
</stafcmd>

stafcmd元素可以用来调用staf的service,包含三个子元素,location,service以及request。其中location表示机器,service表示具体的服务名称,request为具体执行的命令。

获取stafcmd命令执行的返回值:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
<defaultcall function="main"/>
<function name="main">
<sequence>
<stafcmd>
<location>'local'</location>
<service>'var'</service>
<request>'resolve string {STAF/Config/OS/Name}'</request>
</stafcmd>
<if expr="RC != 0">
<message>'Oops, RC = %s, Result = %s' % (RC, STAFResult)</message>
<else>
<message>'Great! STAF/Config/OS/Name = %s' % (STAFResult)</message>
</else>
</if>
</sequence>
</function>
</stax>

因为function element只能允许包含一个子元素,而在检查stafcmd执行的返回值的时候有个if子元素,因此需要使用sequence 进行wrapper。stafcmd命令执行的返回值可以通过变量RC来进行确认,expr属性用来申明python的表达式。message元素则用来向monitor显示信息。STAFResult用来存储执行结果的具体信息。

成功执行的时候信息显示如下:

20110915-10:09:54    Great! STAF/Config/OS/Name = WinXP                 


process也可以去验证执行的返回值,并且可以使用env元素申明环境变量。returnstdout用来申明process 完成时候的标准输出,而stderr则是表示标准错误输出。
<sequence>
<process name="'My Test Process'">
<location>'local'</location>
<command>
'java com.ibm.staf.service.stax.TestProcess 10 3 99'
</command>
<env>
'CLASSPATH=C:/STAF/bin/JSTAF.jar;C:/STAF/services/stax/STAXMon.jar'
</env>
<stderr mode="'stdout'"/>
<returnstdout/>
</process>
<if expr="RC != 0">
<message>'Error: RC=%s, STAXResult=%s' % (RC, STAXResult)</message>
<else>
<message>'Process RC was 0. STAXResult=%s' % STAXResult</message>
</else>
</if>
</sequence>
4 使用参数:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE stax SYSTEM "stax.dtd">
<stax>
<defaultcall function="main"/>
<function name="main">
<function-prolog>
This function is used as an example in the "Getting Started with STAX"
document. It starts the TestProcess, and allows the parms, machine,
java_command, java_class, processName, and classpath to be passed as
arguments to the
</function-prolog>
<function-map-args>
<function-required-arg name="parms">
The three parameters to pass to the process.
</function-required-arg>
<function-optional-arg name="machine" default="'local'">
The name of machine where the test process should run.
</function-optional-arg>
<function-optional-arg name="java_command" default="'java'">
The name of java executable that should be used to execute the test
process.
</function-optional-arg>
<function-optional-arg name="java_class"
default="'com.ibm.staf.service.stax.TestProcess'">
The name of java class for the test process.
</function-optional-arg>
<function-optional-arg name="processName" default="'My Test Process'">
The name of the process.
</function-optional-arg>
<function-optional-arg name="classpath"
default="'{STAF/Config/STAFRoot}/bin/JSTAF.jar;{STAF/Config/STAFRoot}/services/stax/STAXMon.jar'">
The CLASSPATH that should be used when the test process is started..
</function-optional-arg>
</function-map-args>
<sequence>
<process name="processName">
<location>machine</location>
<command>'%s %s %s' % (java_command, java_class, parms)</command>
<env>'CLASSPATH=%s' % classpath</env>
<stderr mode="'stdout'"/>
<returnstdout/>
</process>
<if expr="RC != 0">
<message>'Error: RC=%s, STAXResult=%s' % (RC, STAXResult)</message>
<else>
<message>'Process RC was 0. STAXResult=%s' % STAXResult</message>
</else>
</if>
</sequence>
</function>

</stax>


function-prolog:函数的说明,相当于注释
function-map-args:表明你可以传递对函数的参数传递一个python map,上面的例子中可以传递6个参数
function-required-arg表示是必须的参数
function-optional-arg.表示可选的参数,如果是可选的,必须声明default的值,如default="'java'"。这两个元素的值是对函数参数的具体说明

可以通过log元素对job的执行添加日志,在message中时候log和level属性,其中level表示日志的级别。如果函数的执行需要返回给调用者,则可以使用return 元素。<return>RC</return>

5 使用import和call

1: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2: <!DOCTYPE stax SYSTEM "stax.dtd">
3:
4: <stax>
5:
6: <defaultcall function="begin_tests"/>
7:
8: <script>
9: ImportMachine = 'local'
10: ImportDirectory = '{STAF/Config/STAFRoot}/services/stax'
11: </script>
12:
13: <function name="begin_tests">
14:
15: <sequence>
16:
17: <import machine="ImportMachine"
18: file="'%s/FunctionParametersLogging.xml' % ImportDirectory"/>
19:
20: <call function="'main'">{ 'parms' : '9 2 7' }</call>
21:
22: <call function="'main'">{ 'parms' : '2 9 15' }</call>
23:
24: </sequence>
25:
26: </function>
27:
28: </stax>


import可以从其他STAX xml文件中import函数。上面的例子是import 所有的函数,call元素则用来调用,script元素中用来定义变量。上述例子中调用两次。如果想并行运行job,可以使用parallel 元素。
<parallel>
<call function="'main'">{ 'parms' : '40 1 0' }</call>
<call function="'main'">{ 'parms' : '15 2 0' }</call>
<call function="'main'">{ 'parms' : '10 2 0' }</call>
</parallel>

使用循环:
<loop from="1" to="3" var="index">
<block name="'Block #%s' % index">
<call function="'main'">{ 'parms' : '10 %s 0' % index }</call>
</block>
</loop>
在机器执行的时候可以使用loop来控制执行,其中from和to分别表示循环的起始,var表示循环迭代的变量。
在XML中还可以使用testcase元素:
<testcase name="'Test Process'">
<sequence>
<script>r = randint(1, 100)</script>
<call function="'main'">{ 'parms' : '1 1 %s' % r }</call>
<if expr="STAXResult &lt;= 50">
<tcstatus result="'pass'"/>
<else>
<tcstatus result="'fail'"/>
</else>
</if>
</sequence>
</testcase>
使用testcase之后可以嵌入tcstatus来确认执行的结果。

Java xml解析器SAX解析与StAX解析比较

最近了解到JDK6添加一个名为 StAX 的新解析方法,具体可以参考 在JDK 6.0 中基于 StAX 分析 XML 数据 。在J2ME 下可以使用 XmlPullParser ,参考 http:/...
  • zzy7075
  • zzy7075
  • 2016年05月21日 09:17
  • 1251

JavaEE实战——XML文档DOM、SAX、STAX解析方式详解

本文主要介绍XML文档作为存储和传输数据的三种解析方式,其各自主要的思想、实现方式、CURD实现,以及最后展示一个综合的实战例子加以巩固理解。...
  • zhongkelee
  • zhongkelee
  • 2016年06月22日 23:10
  • 2235

stax解析xml文档的6种方式

stax解析xml文档的方式: 基于光标的查询; 基于迭代模型的查找; 基于过滤器的查找; 基于xpath的查找; 使用 XMLStreamWriter 创建 xml 文档: 通过 Transform...
  • u011593278
  • u011593278
  • 2013年08月04日 10:53
  • 1346

使用Stax解析XML

完整版见https://jadyer.github.io/2013/03/19/xml-stax/
  • jadyer
  • jadyer
  • 2013年03月19日 15:03
  • 1833

使用 StAX 解析 XML

1、前言 本文大部分摘抄于IBM developerworks(主要是理论),详下面三篇文章,摘抄主要是为了使自己理解更深一点儿,仅当作笔记而已...也是为了以后再次使用时有个参考!摘抄并不全面...
  • zhangyihui1986
  • zhangyihui1986
  • 2013年02月01日 18:37
  • 2640

Stax处理XML(三)——XPath的使用和写文档、修改文档

(1)XPath的使用 前面讲了Stax处理XML的查找,有基于光标的查找,和基于迭代模型的查找。Stax也支持XPath查找。 /** * XPath的使用 * 查找category为WE...
  • linjingj
  • linjingj
  • 2013年12月31日 23:50
  • 2671

Java Stax操作XML简介

使用stax操作xml 非常的简单,它的读取过程像是一个光标在移动。针对不同的节点做不同的处理。 先看一个基于光标的模型处理xml:public class StaxTest { @Test ...
  • u012702547
  • u012702547
  • 2015年05月09日 16:30
  • 6220

使用StAX解析XML

http://blog.sina.com.cn/s/blog_5b8c66750100a7yc.html StAX 概述 从一开始,Java API for XML Processing ...
  • lqglqglqg
  • lqglqglqg
  • 2015年08月27日 11:35
  • 202

stax方法解析XML

一SAX解析    SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SA...
  • wenzhixindazhi
  • wenzhixindazhi
  • 2013年12月03日 11:23
  • 328

SAX解析xml带冒号

版权声明:使用署名-非商业性使用CC协议[http://creativecommons.org/licenses/by-nc/3.0/deed.zh] 目录(?)[+] ...
  • fdsdfadsfasdf
  • fdsdfadsfasdf
  • 2017年03月09日 17:57
  • 172
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STAX XML 解析
举报原因:
原因补充:

(最多只允许输入30个字)