pepve/dom-creator

PHP 中创建 DOMDocument 的有限但简单的 API

v2.1.0 2014-09-23 15:55 UTC

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 自动生成