setAttribute / addAttribute中的XML实体

时间:2011-11-22 20:29:48

标签: php xml dom entity simplexml

好吧,也许我错过了一些简单的事情。我一直在寻找相当一段时间,没有运气。我需要将实体插入XML属性。为了做到这一点,我需要能够使用&符号(&)和DOM类的setAttribute方法(或addAttribute类的simpleXML)。当我尝试使用它时,它会逃脱&符号,因此&entity;变为&entity;。尝试手动转义符号\&entity;只会产生\&entity;。输入&符实体&entity;只需加倍&entity;。我明白为什么会这样做,如果没有与有效实体相关联,&符号将会破坏XML。问题是,它与实体相关联,我无法弄清楚如何使用它。

我找到了createEntityReferenceDOMEntityReference方法,但这些方法的文档很差,我不确定这些是否是我需要的。谷歌搜索这些术语似乎只是提出相同的PHP文档,但来自不同的网站。我已经尝试单独搜索这个问题,但我得到的结果解释了我已经知道并在上面指出的内容。我已经尝试了DOM和SimpleXML,但两者都产生了相同的结果。我只是过于复杂化了,还是真的不支持?

1 个答案:

答案 0 :(得分:2)

坦率地说,对我来说这是一个具有挑战性的问题,因为我自己没有想过,虽然答案很简单:

根据偶数Level 1 of the DOM recommendation接口Attr继承Node接口,即可以将节点附加到属性。 <{1}}孩子允许EntityReference

  

在XML中,属性的值可以包含实体引用,Attr节点的子节点提供不扩展实体引用的表示。这些子节点可以是Text或EntityReference节点。由于属性类型可能未知,因此没有标记化的属性值。

这是PHP中的一个工作示例:

Attr

导致

<?php

// a valid XML should contain used entities declarations to be valid,
// but DOM recs do not contain means to generate DTD;
// in PHP you can use XMLWriter for the purpose though 
$dtd = <<<DTD
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
  <!ENTITY my_entity "some content">
]>
<root/>
DTD;

$xml = new DOMDocument();
$xml->formatOutput = true;

$xml->loadXML($dtd);

$root = $xml->documentElement;

$entity = $xml->createEntityReference( 'my_entity' );

$an_attr = $xml->createAttribute( 'attr' );
$an_attr->appendChild( $xml->createTextNode('prefix ') );
$an_attr->appendChild( $entity );
$an_attr->appendChild( $xml->createTextNode(' suffix') );
$root->setAttributeNode( $an_attr );

// clone the entity to use it more than once
$root->appendChild( $entity->cloneNode() );

print $xml->saveXML();

?>