如果直接调用InterSystems IRIS SAX解析器,则可以根据自己的需要创建自定义内容处理程序。本节讨论以下主题:
%XML.SAX.Parser类中解析方法的参数列表摘要要定制InterSystems IRIS SAX解析器导入和处理XML的方式,请创建并使用定制的SAX内容处理程序。具体地说,创建%XML.SAX.ContentHandler的子类。然后,在新类中,重写任何默认方法以执行所需的操作。在解析XML文档时使用新的内容处理程序作为参数;为此,需要使用%XML.SAX.Parser类的解析方法。
此操作如下图所示:
创建和使用自定义导入机制的过程如下:
%XML.SAX.ContentHandler的类。%XML.SAX.Parser的分析方法之一(即ParseFile()、ParseStream()、ParseString()或ParseURL())编写读取XML文档的类方法。调用分析方法时,请将自定义内容处理程序指定为参数。
%XML.SAX.ContentHandler类在特定时间自动执行某些方法。通过覆盖它们,您可以自定义内容处理程序的行为。
%XML.SAX.ContentHandle类分析XML文件,并在它到达XML文件中的特定点时生成事件。根据事件的不同,会执行不同的方法。这些方法如下:
OnPostParse() — 在XML解析完成时触发。characters() — 由字符数据触发。comment() — 注释触发endCData() —由CDATA部分的末尾触发。endDocument() —由文档结尾触发。endDTD() — 由DTD结束触发。endElement() —由元素的末尾触发。endEntity() — 由一个实体的终结触发。endPrefixMapping() — 由名称空间前缀映射的结束触发。ignorableWhitespace() — 由元素内容中的可忽略空格触发。processingInstruction() — 由XML处理指令触发。skippedEntity() — 被跳过的实体触发。startCData() —由CDATA部分的开头触发。startDocument() — 由文档的开头触发。startDTD() — 由DTD的开头触发。startElement() — 由元素的开始触发。startEntity() — 由一个实体的开始触发。startPrefixMapping() — 由名称空间前缀映射的开始触发。默认情况下,这些方法是空的,可以在自定义内容处理程序中覆盖它们。
%XML.SAX.ContentHandler类在遇到某些错误时也会执行方法:
error() — 由可恢复的解析器错误触发。fatalError() — 由致命的XML解析错误触发。warning() — 由解析器警告通知触发。默认情况下,这些方法为空,可以在自定义内容处理程序中重写它们。
当调用InterSystems IRIS SAX解析器(通过%XML.SAX.Parser类)时,可以指定一个掩码参数来指示哪些回调是感兴趣的。如果未指定掩码参数,解析器将调用内容处理程序的Mask()方法。此方法返回一个整数,该整数指定与内容处理程序的重写方法相对应的复合掩码。
例如,假设创建了一个自定义内容处理程序,其中包含startElement()和endElement()方法的新版本。在本例中,Mask()方法返回一个数值,该数值等于$$$SAXSTARTELEMENT和$$$SAXENDELEMENT,之和,这两个标志对应于这两个事件。如果没有为解析方法指定掩码参数,则解析器将调用内容处理程序的Mask()方法,因此只处理这两个事件。
%XML.SAX.ContentHandler类提供在特殊情况下有用的其他方法:
LocatePosition()-通过引用返回两个参数,这两个参数指示解析的文档中的当前位置。第一个表示行号,第二个表示行偏移。PushHandler()-在堆栈上推送新的内容处理程序。SAX的所有后续回调都将转到这个新的内容处理程序,直到该处理程序完成处理。如果在解析一种类型的文档时遇到想要以不同方式解析的一段XML,则可以使用此方法。在本例中,当检测到要以不同方式处理的段时,调用PushHandler()方法,该方法将创建一个新的内容处理程序实例。所有回调都会转到此内容处理程序,直到调用PopHandler()返回上一个内容处理程序。
PopHandler()-返回堆栈上的上一个内容处理程序。这些是final方法,不能重写。
要指定文档源,请使用%XML.SAX.Parser类的ParseFile()、ParseStream()、ParseString()或ParseURL()方法。在任何情况下,源文档都必须是格式良好的XML文档;也就是说,它必须遵守XML语法的基本规则。完整的参数列表按顺序如下:
%XML.SAX.ContentHandler类的实例。%XML.SAX.Parser的解析方法,默认掩码为0。这意味着解析器调用内容处理程序的Mask()方法。该方法通过检测(在编译期间)在事件处理程序中自定义的所有事件回调来计算掩码。只处理那些事件回调。"namespace URL,namespace URL"这里,Namespace是用于模式的XML名称空间,URL是提供模式文档位置的URL。名称空间和URL值之间有一个空格字符。
Namespace是用于模式的XML名称空间,URL是提供模式文档位置的URL。名称空间和URL值之间有一个空格字符。SSL/TLS配置的配置名称。注意:请注意,此参数列表与%XML.TextReader类的解析方法略有不同。有一点不同,%XML.TextReader不提供指定自定义内容处理程序的选项。
想要一个文件中出现的所有XML元素的列表。要做到这一点,只需记录每个开始元素。那么这个过程是这样的:
MyApp.Handler的类,它扩展%XML.SAX.ContentHandler:Class MyApp.Handler Extends %XML.SAX.ContentHandler
{
}startElement()方法:Class MyApp.MyHandler extends %XML.SAX.ContentHandler
{
// ...
Method startElement(uri as %String, localname as %String,
qname as %String, attrs as %List)
{
//we have found an element
write !,"Element: ",localname
}
}Class MyApp.MyHandler extends %XML.SAX.ContentHandler
{
// ...
ClassMethod ReadFile(file as %String) as %Status
{
//create an instance of this class
set handler=..%New()
//parse the given file using this instance
set status=##class(%XML.SAX.Parser).ParseFile(file,handler)
//quit with status
quit status
}
}请注意,这是一个类方法,因为它在应用程序中被调用以执行其处理。此方法执行以下操作:
set handler=..%New()%XML.SAX.Parser的ParseFile()方法。这将验证并解析文档(由fileName指定),并调用内容处理程序对象的各种事件处理方法: set status=##class(%XML.SAX.Parser).ParseFile(file,handler)每次在解析器解析文档时发生事件(如开始或结束元素)时,解析器都会调用内容处理程序对象中的适当方法。在本例中,唯一被覆盖的方法是startElement(),它随后写出元素名称。对于其他事件,例如到达End元素,不会发生任何事情(默认行为)。
ParseFile()方法到达文件末尾时,它返回。处理程序对象超出作用域,并自动从内存中删除。ReadFile()方法,将文件传递给解析: Do ##class(Samples.MyHandler).ReadFile(filename)其中,filename是正在读取的文件的路径。
例如,如果文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Person>
<Name>Edwards,Angela U.</Name>
<DOB>1980-04-19</DOB>
<GroupID>K8134</GroupID>
<HomeAddress>
<City>Vail</City>
<Zip>94059</Zip>
</HomeAddress>
<Doctors>
<Doctor>
<Name>Uberoth,Wilma I.</Name>
</Doctor>
<Doctor>
<Name>Wells,George H.</Name>
</Doctor>
</Doctors>
</Person>
</Root>则此示例的输出如下所示:
Element: Root
Element: Person
Element: Name
Element: DOB
Element: GroupID
Element: HomeAddress
Element: City
Element: Zip
Element: Doctors
Element: Doctor
Element: Name
Element: Doctor
Element: Name%XML.SAX.Parser支持HTTPS。也就是说,可以使用此类执行以下操作:
ParseURL())解析HTTPS位置提供的XML文档。HTTPS位置的实体。在所有情况下,如果这些项目中的任何一个是在HTTPS位置上提供的,请执行以下操作:
SSL/TLS配置。这是一次性的步骤。%XML.SAX.Parser的适用解析方法时,请指定pSSLConfiguration参数。默认情况下,InterSystems IRIS使用Xerces图元解析。%XML.SAX.Parser仅在以下情况下使用其自己的实体解析:
PSSLConfiguration参数非空。本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。