第三章 IRIS 读取和验证XML文档

InterSystems IRIS提供了三种读取和解析XML文档的基本方法:

  • 对于任何XML文档,您都可以使用%XML.TextReader。使用此API,在读取文档后,您将打开一个%XML.TextReader实例,您可以使用该实例逐节点检查文档。

  • 对于任何XML文档,都可以使用%XML.Reader,然后以XML文档对象模型(DOM)的形式访问该文档。

  • 如果XML文档映射到启用了XML的类定义,则可以使用%XML.Reader将该文档导入该类的实例。

%XML.TextReader%XML.Reader都使用InterSystems IRIS SAX(Simple API for XML)Parser。

3.2 检查文件是否格式正确

当您阅读XML文档时,通常会同时执行验证。也就是说,SAX解析器检查文档的格式是否正确,并根据声明的模式或DTD验证文档,同时执行其他任务。

如果您只需要查看XML文档的格式是否正确,请使用%XML.TextReader,如下所示:

  1. 通过以下方法之一的第一个参数指定文档源:
方法第一个自变量
ParseFile()具有完整路径的文件名。请注意,文件名和路径必须仅包含ASCII字符。
ParseStream()A stream
ParseString()A string
ParseURL()A URL
  1. 检查解析方法返回的状态。如果状态包含错误代码,则错误代码将指示问题的位置。

    请注意,文档可能包含多个错误,但解析器在无法再读取文档时会退出。

例如:

USER>set file="C:\0work\XMLdemo\inputfile2.xml"
 
USER>set status=##class(%XML.TextReader).ParseFile(file)
 
USER>write status=1
1
USER>set file="C:\0work\XMLdemo\inputfile2a.xml"
 
USER>set status=##class(%XML.TextReader).ParseFile(file)
 
USER>write status=1
0
USER>d $system.OBJ.DisplayError(status)
 
ERROR #6301: SAX XML Parser Error: expected end of tag 'xlistitem' while processing 
C:\0work\XMLdemo\inputfile2a.xml at line 423 offset 3

3.2 检查文档是否遵循其Schema或DTD

您还可以使用%XML.TextReader,根据声明的架构或DTD验证文档(视情况而定)。为此,请调用ParseFile()ParseStream()PareString()ParseURL(),如前一节所述,但也包括第二个参数TextReader。此参数作为输出返回,是%XML.TextReader的一个实例,您可以使用来迭代文档并查找错误和警告。

例如:

ClassMethod ValidateFile(file As %String = "C:\0work\XMLdemo\inputfile2.xml",schema as %String="")
{
    write !!,"Validating "_file_"..."
    
    if (schema="") {
        //in this case, use the schema that the file refers to
        Set status=##class(%XML.TextReader).ParseFile(file,.tReader,,flags)
    } else {
        //use an override schema
        Set status=##class(%XML.TextReader).ParseFile(file,.tReader,,flags,,schema)
    }
    if $$$ISERR(status) {
        do $system.OBJ.DisplayError(status)
    }
    if '$ISOBJECT(tReader) {
        write !, ">>> Cannot read this file, because it is not valid..."
        quit
    }
    set errcount=0
    set warningcount=0
    while (tReader.Read()) {
        if (tReader.NodeType="error") {
            set errcount=errcount+1
            Write !, ">>> *ERROR* ",tReader.Value
        } elseif (tReader.NodeType="warning") {
            set warningcount=warningcount+1
            Write !, ">>> *WARNING* ",tReader.Value
        }
    }
    if (errcount=0) && (warningcount=0) {
        write !, ">>> No warnings or errors"
    }
}

您可以使用以下附加方法递归扫描目录中的文件:

ClassMethod ValidateFilesInDir(dirtoprocess As %String = "C:\0work\XMLdemo",schema as %String="")
{
    set stmt = ##class(%SQL.Statement).%New()
    set status = stmt.%PrepareClassQuery("%File","FileSet")
    if $$$ISERR(status) { 
        do $system.OBJ.DisplayError(status)
        quit  
    }

    set rset = stmt.%Execute(dirtoprocess,"*.xml",,1)
    while rset.%Next() {
        set filetoprocess=rset.%Get("Name")
        set type=rset.%Get("Type")
        if (type="F") {
            do ..ValidateFile(filetoprocess,schema)
        } elseif (type="D") {
            set dirname=rset.%Get("Name")
            do ..ValidateFilesInDir(dirname)
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值