class REXML::Document
表示一个 XML 文档。
一个文档可能具有
-
一个可以通过方法
root
访问的单个子节点。 -
一个 XML 声明。
-
一个文档类型。
-
处理指令。
赶时间?¶ ↑
常量
- DECLARATION
一个方便的默认 XML 声明。使用
mydoc << XMLDecl.default
属性
公共类方法
获取实体展开限制。默认情况下,该限制设置为 10000。
已弃用。请改用 REXML::Security.entity_expansion_limit=
。
# File rexml-3.4.0/lib/rexml/document.rb, line 417 def Document::entity_expansion_limit return Security.entity_expansion_limit end
设置实体展开限制。默认情况下,该限制设置为 10000。
已弃用。请改用 REXML::Security.entity_expansion_limit=
。
# File rexml-3.4.0/lib/rexml/document.rb, line 410 def Document::entity_expansion_limit=( val ) Security.entity_expansion_limit = val end
获取实体展开限制。默认情况下,该限制设置为 10240。
已弃用。请改用 REXML::Security.entity_expansion_text_limit
。
# File rexml-3.4.0/lib/rexml/document.rb, line 431 def Document::entity_expansion_text_limit return Security.entity_expansion_text_limit end
设置实体展开限制。默认情况下,该限制设置为 10240。
已弃用。请改用 REXML::Security.entity_expansion_text_limit=
。
# File rexml-3.4.0/lib/rexml/document.rb, line 424 def Document::entity_expansion_text_limit=( val ) Security.entity_expansion_text_limit = val end
返回一个新的 REXML::Document 对象。
当没有给出参数时,返回一个空文档
d = REXML::Document.new d.to_s # => ""
当给出参数 string
时,它必须是一个包含有效 XML 文档的字符串
xml_string = '<root><foo>Foo</foo><bar>Bar</bar></root>' d = REXML::Document.new(xml_string) d.to_s # => "<root><foo>Foo</foo><bar>Bar</bar></root>"
当给出参数 io_stream
时,它必须是一个为读取而打开的 IO 对象,并且在读取时必须返回一个有效的 XML 文档
File.write('t.xml', xml_string) d = File.open('t.xml', 'r') do |io| REXML::Document.new(io) end d.to_s # => "<root><foo>Foo</foo><bar>Bar</bar></root>"
当给出参数 document
时,它必须是一个现有的文档对象,其上下文和属性(但不是子节点)被克隆到新文档中
d = REXML::Document.new(xml_string) d.children # => [<root> ... </>] d.context = {raw: :all, compress_whitespace: :all} d.add_attributes({'bar' => 0, 'baz' => 1}) d1 = REXML::Document.new(d) d1.children # => [] d1.context # => {:raw=>:all, :compress_whitespace=>:all} d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'}
当给出参数 context
时,它必须是一个包含文档上下文条目的哈希;请参见元素上下文
context = {raw: :all, compress_whitespace: :all} d = REXML::Document.new(xml_string, context) d.context # => {:raw=>:all, :compress_whitespace=>:all}
# File rexml-3.4.0/lib/rexml/document.rb, line 92 def initialize( source = nil, context = {} ) @entity_expansion_count = 0 @entity_expansion_limit = Security.entity_expansion_limit @entity_expansion_text_limit = Security.entity_expansion_text_limit super() @context = context return if source.nil? if source.kind_of? Document @context = source.context super source else build( source ) end end
# File rexml-3.4.0/lib/rexml/document.rb, line 403 def Document::parse_stream( source, listener ) Parsers::StreamParser.new( source, listener ).parse end
公共实例方法
向文档添加一个对象;返回 self
。
当给出参数 xml_decl
时,它必须是一个 REXML::XMLDecl
对象,它将成为文档的 XML 声明,替换之前的 XML 声明(如果有)
d = REXML::Document.new d.xml_decl.to_s # => "" d.add(REXML::XMLDecl.new('2.0')) d.xml_decl.to_s # => "<?xml version='2.0'?>"
当给出参数 doc_type
时,它必须是一个 REXML::DocType
对象,它将成为文档的文档类型,替换之前的文档类型(如果有)
d = REXML::Document.new d.doctype.to_s # => "" d.add(REXML::DocType.new('foo')) d.doctype.to_s # => "<!DOCTYPE foo>"
当给出参数 object
(不是 REXML::XMLDecl
或 REXML::DocType
对象) 时,它将作为最后一个子节点添加
d = REXML::Document.new d.add(REXML::Element.new('foo')) d.to_s # => "<foo/>"
# File rexml-3.4.0/lib/rexml/document.rb, line 172 def add( child ) if child.kind_of? XMLDecl if @children[0].kind_of? XMLDecl @children[0] = child else @children.unshift child end child.parent = self elsif child.kind_of? DocType # Find first Element or DocType node and insert the decl right # before it. If there is no such node, just insert the child at the # end. If there is a child and it is an DocType, then replace it. insert_before_index = @children.find_index { |x| x.kind_of?(Element) || x.kind_of?(DocType) } if insert_before_index # Not null = not end of list if @children[ insert_before_index ].kind_of? DocType @children[ insert_before_index ] = child else @children[ insert_before_index-1, 0 ] = child end else # Insert at end of list @children << child end child.parent = self else rv = super raise "attempted adding second root element to document" if @elements.size > 1 rv end end
通过调用 REXML::Element.add_element
向文档添加一个元素
REXML::Element.add_element(name_or_element, attributes)
# File rexml-3.4.0/lib/rexml/document.rb, line 211 def add_element(arg=nil, arg2=nil) rv = super raise "attempted adding second root element to document" if @elements.size > 1 rv end
返回执行 Document.new(self)
后产生的新文档。请参见Document.new
。
# File rexml-3.4.0/lib/rexml/document.rb, line 122 def clone Document.new self end
返回文档的 DocType
对象(如果存在),否则返回 nil
d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">') d.doctype.class # => REXML::DocType d = REXML::Document.new('') d.doctype.class # => nil
# File rexml-3.4.0/lib/rexml/document.rb, line 243 def doctype @children.find { |item| item.kind_of? DocType } end
# File rexml-3.4.0/lib/rexml/document.rb, line 446 def document self end
返回文档的 XMLDecl
编码(如果已设置),否则返回默认编码
d = REXML::Document.new('<?xml version="1.0" encoding="UTF-16"?>') d.encoding # => "UTF-16" d = REXML::Document.new('') d.encoding # => "UTF-8"
# File rexml-3.4.0/lib/rexml/document.rb, line 292 def encoding xml_decl().encoding end
返回一个空字符串。
# File rexml-3.4.0/lib/rexml/document.rb, line 131 def expanded_name '' #d = doc_type #d ? d.name : "UNDEFINED" end
返回符号 :document
。
# File rexml-3.4.0/lib/rexml/document.rb, line 112 def node_type :document end
# File rexml-3.4.0/lib/rexml/document.rb, line 439 def record_entity_expansion @entity_expansion_count += 1 if @entity_expansion_count > @entity_expansion_limit raise "number of entity expansions exceeded, processing aborted." end end
返回文档的根元素(如果存在),否则返回 nil
d = REXML::Document.new('<root></root>') d.root # => <root/> d = REXML::Document.new('') d.root # => nil
# File rexml-3.4.0/lib/rexml/document.rb, line 227 def root elements[1] #self #@children.find { |item| item.kind_of? Element } end
返回文档的 XMLDecl
独立值(作为字符串)(如果已设置),否则返回默认独立值
d = REXML::Document.new('<?xml standalone="yes"?>') d.stand_alone? # => "yes" d = REXML::Document.new('') d.stand_alone? # => nil
# File rexml-3.4.0/lib/rexml/document.rb, line 307 def stand_alone? xml_decl().stand_alone? end
返回此文档的 XMLDecl
版本(作为字符串)(如果已设置),否则返回默认版本
d = REXML::Document.new('<?xml version="2.0" encoding="UTF-8"?>') d.version # => "2.0" d = REXML::Document.new('') d.version # => "1.0"
# File rexml-3.4.0/lib/rexml/document.rb, line 277 def version xml_decl().version end
输出 XML 树,可以选择缩进。这将输出整个 XML 文档,包括 XML 声明、doctype 声明和处理指令(如果提供了)。
一个有争议的点是,无论用户(或源文档)是否提供 XML 声明(<?xml version=‘1.0’?>),Document
是否应该始终写入 XML 声明。REXML
在未指定的情况下不会写入,因为它会为 XML-RPC 等应用程序增加不必要的带宽。
接受 Nth 参数样式和选项哈希样式作为参数。对于一个或多个参数的情况,建议使用选项哈希样式。
示例
Document.new("<a><b/></a>").write output = "" Document.new("<a><b/></a>").write(output) output = "" Document.new("<a><b/></a>").write(:output => output, :indent => 2)
另请参阅 rexml/formatters 包中的类,以了解更改 XML 输出的默认格式的正确方法。
示例
output = "" tr = Transitive.new tr.write(Document.new("<a><b/></a>"), output)
- output
-
输出一个支持“<< string”的对象;这是文档将被写入的地方。
- indent
-
一个整数。如果为 -1,则不使用缩进;否则,缩进将是此数字的两倍空格,并且子节点将额外缩进一定的量。对于值为 3,每个项目将额外缩进 3 个级别,或 6 个空格 (2 * 3)。默认为 -1
- transitive
-
如果 transitive 为 true 且 indent >= 0,则输出将以一种方式进行漂亮打印,使得添加的空格不会影响文档的绝对值——也就是说,它使文档中
Text
节点的值和数量保持不变。 - ie_hack
-
此 hack 在空标签上的 /> 前插入一个空格,以解决 Internet Explorer 的一个限制。默认为 false
- encoding
-
Encoding
名称作为字符串。将输出编码更改为指定的编码,而不是 XML 声明中的编码。默认为 nil。这意味着使用 XML 声明中的编码。
# File rexml-3.4.0/lib/rexml/document.rb, line 367 def write(*arguments) if arguments.size == 1 and arguments[0].class == Hash options = arguments[0] output = options[:output] indent = options[:indent] transitive = options[:transitive] ie_hack = options[:ie_hack] encoding = options[:encoding] else output, indent, transitive, ie_hack, encoding, = *arguments end output ||= $stdout indent ||= -1 transitive = false if transitive.nil? ie_hack = false if ie_hack.nil? encoding ||= xml_decl.encoding if encoding != 'UTF-8' && !output.kind_of?(Output) output = Output.new( output, encoding ) end formatter = if indent > -1 if transitive require_relative "formatters/transitive" REXML::Formatters::Transitive.new( indent, ie_hack ) else REXML::Formatters::Pretty.new( indent, ie_hack ) end else REXML::Formatters::Default.new( ie_hack ) end formatter.write( self, output ) end
返回文档的 XMLDecl
对象(如果存在),否则返回默认的 XMLDecl
对象
d = REXML::Document.new('<?xml version="1.0" encoding="UTF-8"?>') d.xml_decl.class # => REXML::XMLDecl d.xml_decl.to_s # => "<?xml version='1.0' encoding='UTF-8'?>" d = REXML::Document.new('') d.xml_decl.class # => REXML::XMLDecl d.xml_decl.to_s # => ""
# File rexml-3.4.0/lib/rexml/document.rb, line 260 def xml_decl rv = @children[0] return rv if rv.kind_of? XMLDecl @children.unshift(XMLDecl.default)[0] end
私有实例方法
# File rexml-3.4.0/lib/rexml/document.rb, line 451 def build( source ) Parsers::TreeParser.new( source, self ).parse end