好吧,也许我错过了一些简单的事情。我一直在寻找相当一段时间,没有运气。我需要将实体插入XML属性。为了做到这一点,我需要能够使用&符号(&)和DOM类的setAttribute
方法(或addAttribute
类的simpleXML
)。当我尝试使用它时,它会逃脱&符号,因此&entity;
变为&entity;
。尝试手动转义符号\&entity;
只会产生\&entity;
。输入&符实体&entity;
只需加倍&entity;
。我明白为什么会这样做,如果没有与有效实体相关联,&符号将会破坏XML。问题是,它与实体相关联,我无法弄清楚如何使用它。
我找到了createEntityReference和DOMEntityReference方法,但这些方法的文档很差,我不确定这些是否是我需要的。谷歌搜索这些术语似乎只是提出相同的PHP文档,但来自不同的网站。我已经尝试单独搜索这个问题,但我得到的结果解释了我已经知道并在上面指出的内容。我已经尝试了DOM和SimpleXML,但两者都产生了相同的结果。我只是过于复杂化了,还是真的不支持?
答案 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();
?>