Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP如何使用QUOTE;包含DOMdocument的XML实体_Php_Xml_Dom - Fatal编程技术网

PHP如何使用QUOTE;包含DOMdocument的XML实体

PHP如何使用QUOTE;包含DOMdocument的XML实体,php,xml,dom,Php,Xml,Dom,我正在修改由其他库生成的XML文件的内容。我正在使用PHP(5.3.10)对DOM进行一些修改,并重新插入一个替换节点 我正在处理的XML数据具有”和;元素,并且我希望在完成修改时保持这些元素 但是,我在PHP更改“元素时遇到问题。请参阅我的示例 $temp = 'Hello "XML".'; $doc = new DOMDocument('1.0', 'utf-8'); $newelement = $doc->createElement('descri

我正在修改由其他库生成的XML文件的内容。我正在使用PHP(5.3.10)对DOM进行一些修改,并重新插入一个替换节点

我正在处理的XML数据具有
”和
;元素,并且我希望在完成修改时保持这些元素

但是,我在PHP更改
元素时遇到问题。请参阅我的示例

$temp = 'Hello "XML".';
$doc = new DOMDocument('1.0', 'utf-8');
$newelement = $doc->createElement('description', $temp);
$doc->appendChild($newelement);
echo $doc->saveXML() . PHP_EOL; // shows " instead of element
$node = $doc->getElementsByTagName('description')->item(0);
echo $node->nodeValue . PHP_EOL; // also shows "
输出

<?xml version="1.0" encoding="utf-8"?> 
<description>Hello "XML".</description>

Hello "XML".
<?xml version="1.0" encoding="utf-8"?>
<description>Hello "XML" &amp;.</description>

Hello "XML" &.
输出

<?xml version="1.0" encoding="utf-8"?> 
<description>Hello "XML".</description>

Hello "XML".
<?xml version="1.0" encoding="utf-8"?>
<description>Hello "XML" &amp;.</description>

Hello "XML" &.

您好“XML”;。
您好“XML”&。

答案是它实际上不需要任何转义(跳过CDATA的提及):

符号(&)和左尖括号()可以使用字符串
(…)表示

为了允许属性值同时包含单引号和双引号,撇号或单引号字符(')可以表示为
“&apos;“
,双引号字符(“)为

您可以通过使用
createTextNode()
执行正确的转义来轻松验证这一点:

$dom = new DOMDocument;
$e = $dom->createElement('description');
$content = 'single quote: \', double quote: ", opening tag: <, ampersand: &, closing tag: >';
$t = $dom->createTextNode($content);
$e->appendChild($t);
$dom->appendChild($e);

echo $dom->saveXML();
$dom=新的DOMDocument;
$e=$dom->createElement('description');
$content='单引号:\',双引号:',开头标记:';
$t=$dom->createTextNode($content);
$e->t(t);
$dom->appendChild($e);
echo$dom->saveXML();
输出:

<?xml version="1.0"?>
<description>single quote: ', double quote: ", opening tag: &lt;, ampersand: &amp;, closing tag: &gt;</description>

单引号:',双引号:,开始标记:,符号和:&;,结束标记:

有趣-我创建了一个
新DOMText($temp);
作为文本节点,然后将其附加到
$newelement
(一个空的
节点,我得到的结果几乎是正确的:
Hello";XML";
@MichaelBerkowski,这很有趣。如果您使用的是已经编码的字符串$temp,那么您的方法对其进行了双重编码,但它在saveXML期间正确地保持了编码。您能描述一下您正在做的事情吗当我尝试DOMText时,设置了一个“无效字符错误”。我看不出在元素的节点值中未编码双引号有什么错?它们只有在属性值内部时才会被转义。@Ja͢ck XML规范用于在任何文本节点中编码双引号。嗯,规范只提到
&
这很有趣,因为使用我假设WordPress中的XML内部编码正确,在返回时我试图复制它们的XML,并使用它们的代码进行处理。我遇到了PHP/实体的错误,我认为有些地方不对劲,WordPress是对的。我必须查看它们的代码,看看它们是如何在代码中生成这些实体的ir XML。无论出于何种原因,它都会使我对WP如何解析我修改过的XML产生问题。一个简单的问题。当您提到编码“仅适用于属性”时,这是否包括嵌入的html属性?例如,如果文本节点有带属性的html标记?文本节点不能有html标记,因此,开始标记mu他一定会逃走的。