类 Document

类 Document 继承了其超类和包含模块的方法;请参阅

本页上的任务

新建文档

任务:创建空文档

使用方法 Document::new 创建一个空文档。

d = REXML::Document.new

任务:将字符串解析为新文档

使用方法 Document::new 将 XML 字符串解析为新文档

xml_string = '<root><a/>text<b/>more<c/></root>'
d = REXML::Document.new(xml_string)
d.root # => <root> ... </>

任务:将 IO 流解析为新文档

使用方法 Document::new 将 XML IO 流解析为新文档

xml_string = '<root><a/>text<b/>more<c/></root>'
File.write('t.xml', xml_string)
d = File.open('t.xml', 'r') do |file|
  REXML::Document.new(file)
end
d.root # => <root> ... </>

任务:从现有文档创建文档

使用方法 Document::new 从现有文档创建文档。上下文和属性被复制到新文档,但不包括子节点

xml_string = '<root><a/>text<b/>more<c/></root>'
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.context    # => {:raw=>:all, :compress_whitespace=>:all}
d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'}
d1.children   # => []

任务:克隆文档

使用方法 Document#clone 克隆文档。上下文和属性被复制到新文档,但不包括子节点

xml_string = '<root><a/>text<b/>more<c/></root>'
d = REXML::Document.new(xml_string)
d.children    # => [<root> ... </>]
d.context = {raw: :all, compress_whitespace: :all}
d.add_attributes({'bar' => 0, 'baz' => 1})
d1 = d.clone  # => < bar='0' baz='1'/>
d1.context    # => {:raw=>:all, :compress_whitespace=>:all}
d1.attributes # => {"bar"=>bar='0', "baz"=>baz='1'}
d1.children   # => []

文档类型

任务:获取文档类型

使用方法 Document#doctype 获取文档类型

d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">')
d.doctype.class # => REXML::DocType
d = REXML::Document.new('')
d.doctype.class # => nil

任务:设置文档类型

使用方法 document#add 添加或替换文档类型

d = REXML::Document.new('')
d.doctype.class # => nil
d.add(REXML::DocType.new('foo'))
d.doctype.class # => REXML::DocType

XML 声明

任务:获取 XML 声明

使用方法 document#xml_decl 获取 XML 声明

d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">')
d.xml_decl.class # => REXML::XMLDecl
d.xml_decl       # => <?xml ... ?>
d = REXML::Document.new('')
d.xml_decl.class # => REXML::XMLDecl
d.xml_decl       # => <?xml ... ?>

任务:设置 XML 声明

使用方法 document#add 替换 XML 声明

d = REXML::Document.new('<!DOCTYPE document SYSTEM "subjects.dtd">')
d.add(REXML::XMLDecl.new)

子节点

任务:添加元素子节点

使用方法 document#add_element 向文档添加元素

d = REXML::Document.new('')
d.add_element(REXML::Element.new('root'))
d.children # => [<root/>]

任务:添加非元素子节点

使用方法 document#add 向文档添加非元素

xml_string = '<root><a/>text<b/>more<c/></root>'
d = REXML::Document.new(xml_string)
d.add(REXML::Text.new('foo'))
d.children # => [<root> ... </>, "foo"]

写入

任务:写入 $stdout

使用方法 document#write 将文档写入 $stdout

xml_string = '<root><a/>text<b/>more<c/></root>'
d = REXML::Document.new(xml_string)
d.write

输出

<root><a/>text<b/>more<c/></root>

任务:写入 IO 流

使用方法 document#write 将文档写入 $stdout

xml_string = '<root><a/>text<b/>more<c/></root>'
d = REXML::Document.new(xml_string)
File.open('t.xml', 'w') do |file|
  d.write(file)
end
p File.read('t.xml')

输出

"<root><a/>text<b/>more<c/></root>"

任务:写入时不缩进

使用方法 document#write 写入文档时不缩进

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.write({indent: 0})

输出

<root>
<a>
<b>
<c/>
</b>
</a>
</root>

任务:以指定的缩进写入

使用方法 document#write 写入文档时使用指定的缩进

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.write({indent: 2})

输出

<root>
  <a>
    <b>
      <c/>
    </b>
  </a>
</root>

查询

任务:获取文档

使用方法 document#document 获取文档 (self);覆盖 Element#document

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.document == d # => true

任务:获取编码

使用方法 document#document 获取文档 (self);覆盖 Element#document

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.encoding # => "UTF-8"

任务:获取节点类型

使用方法 document#node_type 获取节点类型 (:document);覆盖 Element#node_type

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.node_type # => :document

任务:获取根元素

使用方法 document#root 获取根元素

xml_string = '<root><a><b><c></c></b></a></root>'
d = REXML::Document.new(xml_string)
d.root # => <root> ... </>

任务:确定是否为独立文档

使用方法 document#stand_alone? 获取独立值

d = REXML::Document.new('<?xml standalone="yes"?>')
d.stand_alone? # => "yes"

任务:获取版本

使用方法 document#version 获取版本

d = REXML::Document.new('<?xml version="2.0" encoding="UTF-8"?>')
d.version # => "2.0"