gpt4 book ai didi

php - setAttribute/addAttribute 中的 XML 实体

转载 作者:可可西里 更新时间:2023-10-31 23:33:58 28 4
gpt4 key购买 nike

好吧,也许我漏掉了一些简单的东西。我一直在寻找很长一段时间,但没有运气。我需要将实体插入到 XML 属性中。为此,我需要能够将符号 (&) 与 DOM 类的 setAttribute 方法(或 simpleXML 的 addAttribute 方法结合使用 类)。当我尝试使用它时,它转义了符号,所以 &entity; 变成了 &entity;。尝试手动转义符号 \&entity; 只会导致 \&entity;。键入 & 实体 &entity; 只是将其加倍 &entity;。我明白它为什么这样做,如果不与有效实体关联,& 符号将破坏 XML。问题是,它与一个实体相关联,我不知道如何使用它。

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

最佳答案

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

根据 even Level 1 of the DOM recommendation interface Attr 继承了 Node 接口(interface),也就是说你可以将节点附加到一个属性。 EntityReference 允许在 Attr child 中使用。

In XML, where the value of an attribute can contain entity references, the child nodes of the Attr node provide a representation in which entity references are not expanded. These child nodes may be either Text or EntityReference nodes. Because the attribute type may be unknown, there are no tokenized attribute values.

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

<?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();

?>

结果是

C:\>\php\5.3.8\php.exe entities.php
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY my_entity "some content">
]>
<root attr="prefix &my_entity; suffix">&my_entity;</root>

关于php - setAttribute/addAttribute 中的 XML 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233394/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com