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
,如下所示:
- 通过以下方法之一的第一个参数指定文档源:
方法 | 第一个自变量 |
---|---|
ParseFile() | 具有完整路径的文件名。请注意,文件名和路径必须仅包含ASCII字符。 |
ParseStream() | A stream |
ParseString() | A string |
ParseURL() | A URL |
-
检查解析方法返回的状态。如果状态包含错误代码,则错误代码将指示问题的位置。
请注意,文档可能包含多个错误,但解析器在无法再读取文档时会退出。
例如:
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)
}
}
}