文章
· 六月 15, 2021 阅读大约需 5 分钟

第八章 Other Options of the Writer

第八章 Other Options of the Writer

Other Options of the Writer

Canonicalize()

方法的作用是:以规范化的形式编写XML节点。此方法具有以下签名:

method Canonicalize(node As %XML.Node, ByRef PrefixList, formatXML As %Boolean = 0) as %Status
  • node是文档的一个子树,作为%XML.Node的实例。
  • PrefixList是以下其中之一:
    • 对于包含式规范化,将PrefixList指定为“c14n”
      在本例中,输出的形式是XML Canonicalization Version 1.0,由https://www.w3.org/TR/xml-c14n
    • 对于排他规范化,将PrefixList指定为具有以下节点的多维数组:
Node Value
PrefixList(前缀),其中前缀是名称空间前缀 与此名称空间前缀一起使用的名称空间
  • FormatXML控制格式。如果format XML为true,则编写器使用为编写器实例指定的格式,而不是XML规范化规范指定的格式。因此,输出不是规范的XML,但是已经对规范的XML进行了命名空间处理。此选项对于输出XML文档的片段(如Web服务的ProcessBodyNode()回调中的SOAP主体)很有用,同时仍对格式有一定的控制。

隐藏属性

编写器实例的隐藏属性会影响具有对象值的属性的输出。此类属性允许强制所有此类输出为隐藏输出,也就是说,强制输出包含被引用对象的ID,而不是对象的详细信息。此属性与XMLDEFAULTREFERENCEONSXMLREFERENCEONS(在启用XML的对象属性参数)交互,如下表所示。下表显示了每种情况的结果输出:

Effect of Shallow = 1

XMLREFERENCEXMLDEFAULTREFERENCE的值 Output if Shallow=1
属性参数XMLREFERENCE“SUMMARY”“COMPLETE” 此属性不生成任何输出
属性参数XMLREFERENCE“ID”“OID”“GUID” 该属性生成输出,其类型为IDOIDGUID
属性参数XMLREFERENCE没有设置,但是类参数XMLDEFAULTREFERENCE“SUMMARY”“COMPLETE” 此属性不生成任何输出
属性参数XMLREFERENCE没有设置,但类参数XMLDEFAULTREFERENCE“ID”“OID”“GUID” 该属性生成输出,其类型为IDOIDGUID
属性参数XMLREFERENCE和类参数XMLDEFAULTREFERENCE都没有设置 此属性不生成任何输出

Shallow属性不影响其值为串行对象的属性或具有非对象值的属性。

Summary Property

编写器实例的Summary属性控制是导出整个启用XML的对象,还是只导出其摘要;它可以是下列值之一:
- 值0会导出整个对象;这是默认设置。
- 值1仅导出作为摘要列出的属性。

如将对象投影到XML中所述,对象的摘要由其XMLSUMMARY在类参数中指定;它是逗号分隔的属性列表。
例如,为启用了XML的Person类生成输出,并且默认输出如下所示:

<Persons>
 <Person>
  <Name>Xenia,Yan T.</Name>
  <DOB>1986-10-21</DOB>
 </Person>
 <Person>
  <Name>Vivaldi,Ashley K.</Name>
  <DOB>1981-01-25</DOB>
 </Person>
</Persons>

Person类的XMLSUMMARY设置为“name”。在这种情况下,如果编写器将Summary属性设置为1,则输出将如下所示:

<Persons>
 <Person>
  <Name>Xenia,Yan T.</Name>
 </Person>
 <Person>
  <Name>Vivaldi,Ashley K.</Name>
 </Person>
</Persons>

Base64LineBreaks属性

可以%Binary类型的属性的自动换行符,也可以%xsd.base64Binary类型的属性的自动换行符。为此,请将编写器实例的Base64LineBreaks属性设置为1。在这种情况下,编写器在每76个字符之后插入一个自动换行符/回车符。此属性的默认值为0。

CycleCheck属性

编写器实例的CycleCheck属性控制编写器是否检查引用对象内可能导致错误的任何循环(死循环)。默认值为1,这意味着写入器确实会检查周期。

如果确定没有周期,请将CycleCheck设置为0以略微提高性能。

其他示例:可选择设置的编写器

对于 %XML.Writer的属性的用户,以下方法可能很有用。。它接受一个输入参数,该参数是一个将编写器命名为“version”的字符串。每个编写器版本对应于编写器实例的属性的特定设置。

Class Util.XmlUtils Extends %RegisteredObject
{

/// 在给定wname的情况下,返回具有这些属性的编写器
ClassMethod CreateWriter(wname) As %XML.Writer
{
    set w=##class(%XML.Writer).%New()
    set w.Indent=1
    set w.IndentChars="   "
    if wname="DefaultWriter" {
        set w.Indent=0  ; set back to default
    }
    elseif wname="EncodedWriter" {
        set w.Format="encoded"
    }
    elseif wname="EncodedWriterRefInline" {
        set w.Format="encoded"
        set w.ReferencesInline=1
    }
    elseif wname="AttQualWriter" {
        set w.AttributeQualified=1
    }
    elseif wname="AttUnqualWriter" {
        set w.AttributeQualified=0 ; default
    }
    elseif wname="ElQualWriter" {
        set w.ElementQualified=1 ; default
    }
    elseif wname="ElUnqualWriter" {
        set w.ElementQualified=0
    }
    elseif wname="ShallowWriter" {
        set w.Shallow=1
    }
    elseif wname="SOAPWriter1.1" {
        set w.Format="encoded"
        set w.ReferencesInline=1
    }
    elseif wname="SOAPWriter1.2" {
        set w.Format="encoded12"
        set w.ReferencesInline=1
    }
    elseif wname="SummaryWriter" {
        set w.Summary=1
    }
    elseif wname="WriterNoXmlDecl" {
        set w.NoXMLDeclaration=1
    }
    elseif wname="WriterRefInline" {
        set w.ReferencesInline=1
    }
    elseif wname="WriterRuntimeIgnoreNull" {
        set w.RuntimeIgnoreNull=1
    }
    elseif wname="WriterSuppressXmlns" {
        set w.SuppressXmlns=1
    }
    elseif wname="WriterUTF16" {
        set w.Charset="UTF-16"
    }
    elseif wname="WriterWithDefNS" {
        set w.DefaultNamespace="www.Def.org"
    }
    elseif wname="WriterWithDefNSSuppressXmlns" {
        set w.DefaultNamespace="www.Def.org"
        set w.SuppressXmlns=1
    }
    elseif wname="WriterWithDtdSettings" {
        set w.DocType ="MyDocType"
        set w.SystemID = "http://www.mysite.com/mydoc.dtd"
        set w.PublicID = "-//W3C//DTD XHTML 1.0 Transitional//EN"
        set w.InternalSubset = "" 
    }
    elseif wname="WriterXsiTypes" {
        set w.OutputTypeAttribute=1
    }
    quit w
}

}

以下片段显示了如何使用此方法帮助生成文档示例:

/// method to write one to a file
ClassMethod WriteOne(myfile, cls, element, wname, ns, local, rootns)
{
    set writer=##class(Util.XmlUtils).CreateWriter(wname)
    set mydir="e:/temp/"
    set comment="Output for the class: "_cls
    set comment2="Writer settings: "_wname

    if $extract(mydir,$length(mydir))'="/" {set mydir=mydir_"/"}
    set file=mydir_myfile
    set status=writer.OutputToFile(file)
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit }

    set status=writer.WriteComment(comment)
    if $$$ISERR(status) { do $System.Status.DisplayError(status) quit }

    set status=writer.WriteComment(comment2)
}

请注意,输出将包括两个注释行。一个表示文件中显示的启用XML的类的名称。另一个指示用于生成文件的编写器设置的名称。输出目录是集中控制的(通过参数),这个泛型方法包括传递给RootElement()方法和Object()方法的参数。

讨论 (0)1
登录或注册以继续