pepve / dom-creator
PHP 中创建 DOMDocument 的有限但简单的 API
This package is not auto-updated.
Last update: 2024-09-24 02:47:27 UTC
README
PHP 中创建 DOMDocument 的有限但简单的 API。
- 考虑到最小化冗余
- 对于简单的模式工作得非常好
简例
<? $foo = DomCreator::create('http://example.com/foo', 'f', 'foo'); $foo->ident->name = 'John Doe'; $foo->ident->number = '123'; $foo->content = 'Hello, World!';
生成
<?xml version="1.0"?> <f:foo xmlns:f="http://example.com/foo"> <f:ident> <f:name>John Doe</f:name> <f:number>123</f:number> </f:ident> <f:content>Hello, World!</f:content> </f:foo>
您首先使用工厂函数之一创建一个 DomCreator
实例。然后获取和设置对象上的属性以创建一个 DOM。当您尝试读取/设置属性时,新复杂元素(包含其他元素的元素)会自动创建。这看起来有点像设置常规对象上的属性。不同之处在于,每个动作都会将一个元素追加到树中,而不是覆盖它。因此,动作的顺序很重要,这与在对象上设置内容相反。
当您尝试获取与之前获取的名称相同的属性时,将返回上一个节点。这并不总是希望看到的,因此可以使用 closeChild()
来避免这种行为。
要写入属性,请将属性名前缀为下划线(这是由 DomCreator::ATTRIBUTE_SIGN
设置的)。可以通过调用 __get(..)
和 __set(..)
来创建包含不允许在 PHP 标识符中出现的字符的元素和属性。虽然如果这种情况经常发生,您应该考虑使用另一个 API。
最初位于: https://github.com/pepve/dom-creator-php
API
DomCreator::create($nsUri, $nsPrefix, $root, $qualifyAttributes = false)
使用命名空间和给定的根元素创建一个新实例。指定的命名空间 URI 和命名空间前缀用于所有元素,但默认情况下不用于属性。这可以通过使用作为第四个参数的 true 来更改。
DomCreator::createNoNamespace($root)
使用给定的根元素创建一个新实例,不使用命名空间。您可以使用 $domCreator->_xmlns = 'http://example.com/foo'
来自行设置默认命名空间。
DomCreator::createFragment($nsUri, $nsPrefix, $qualifyAttributes = false)
创建一个新实例以用作片段。这允许函数创建 DOM 的一部分。稍后可以将它添加到另一棵树中,如下所示:$domCreator->FragmentContents = $fragment
。此操作丢弃片段的根元素,因此此函数允许您不必担心它。
DomCreator::createFragmentNoNamespace()
创建一个新实例以用作片段,不使用命名空间。
__get($name)
获取属性。这会创建并追加一个名为属性的新元素,并返回一个代表该类的实例。一个例外是:如果请求的属性与最后一个请求的属性同名,并且尚未调用 closeChild()
,则返回上次调用相同的实例(因此不会创建新元素)。
__set($name, $value)
设置属性。如果属性名以下划线开头(DomCreator::ATTRIBUTE_SIGN
),则创建并追加一个具有给定名称(属性符号被移除)的属性和值。否则,将创建一个新元素,其内容为值。值可以是此类或 DOMNode 的实例,在这种情况下,它们的子元素都将插入到新元素中。
closeChild()
关闭最后一个子元素,使其不再追加任何内容。
getDocument()
获取树的基本 DOMDocument,这在树中的每个节点都是相同的。
getNode()
获取此节点的底层DOMElement。
一些示例
示例 1
<? $foo = DomCreator::create('http://example.com/foo', 'f', 'foo'); $foo->ident->_type = 'person'; $foo->ident->name = 'My Name'; $foo->ident->number = '1234'; $foo->content = 'Here is the content..'; $fooDom = $foo->getDocument(); $fooDom->formatOutput = true; echo $fooDom->saveXml();
输出
<?xml version="1.0"?> <f:foo xmlns:f="http://example.com/foo"> <f:ident type="person"> <f:name>My Name</f:name> <f:number>1234</f:number> </f:ident> <f:content>Here is the content..</f:content> </f:foo>
示例 2
<? $bar = DomCreator::createNoNamespace('Bar'); $bar->One = 1; $bar->Two = 2; $bar->Three = 3; $subBar = DomCreator::createFragmentNoNamespace(); foreach (array('A', 'B') as $i => $letter) { $subBar->Letter->Sequence = $i; $subBar->Letter->Value = $letter; $subBar->closeChild(); } $bar->Sub = $subBar; $dom = new DOMDocument(); $dom->appendChild($dom->createElement('Test', 'value')); $bar->DomPart = $dom; $barDom = $bar->getDocument(); $barDom->formatOutput = true; echo $barDom->saveXml();
输出
<?xml version="1.0"?> <Bar> <One>1</One> <Two>2</Two> <Three>3</Three> <Sub> <Letter> <Sequence>0</Sequence> <Value>A</Value> </Letter> <Letter> <Sequence>1</Sequence> <Value>B</Value> </Letter> </Sub> <DomPart> <Test>value</Test> </DomPart> </Bar>
由 readme.php 自动生成