使用 PHP 的 DOMDocument 保存带有编码文本的 XML
Saving XML with encoded text using PHP's DOMDocument
我正在尝试使用 DOMDocument() 加载一些 XML。我想用编码值保存 XML,但它在调用 saveXML() 时一直对其进行解码。
请看下面的代码:
$xml_str = "<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>";
$dom = new DOMDocument();
$dom->formatOutput = TRUE;
$dom->preserveWhiteSpace = FALSE;
if($dom->loadXML($xml_str)) {
$saved_XML = $dom->saveXML();
print_r("xml -> {$saved_XML}\n");
}
print_r 语句将 return:
<?xml version="1.0"?>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
我正在努力return:
<?xml version="1.0"?>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
这可以吗?
欢迎任何帮助。谢谢。
DOM 将转义所有需要的字符,但不会转义其他字符。文本节点中的引号不需要转义,所以 DOM 不会对它们进行转义。如果加载了 XML 解析器,结果将相同。
这取决于预期的结果。如果要读取特殊字符,只需让 DOM 转义需要的字符并忽略其他字符即可。它将使 XML 更易于阅读且更小。如果您需要读取实体,则必须使用 CDATA 部分或对其进行编码。
$xml = <<<'XML'
<Names>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
<Name><![CDATA[o'rielly, o-no, s~sdf"sdf' one test]]></Name>
<Name>o&#39;rielly, o-no, s~sdf&quot;sdf&#39; one test</Name>
</Names>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
echo "Default:\n";
var_dump($xpath->evaluate('string(//Name[1])'));
echo "Entities:\n";
var_dump($xpath->evaluate('string(//Name[2])'));
echo "CDATA Section:\n";
var_dump($xpath->evaluate('string(//Name[3])'));
echo "Encoded Entities:\n";
var_dump($xpath->evaluate('string(//Name[4])'));
输出:
Default:
string(35) "o'rielly, o-no, s~sdf"sdf' one test"
Entities:
string(35) "o'rielly, o-no, s~sdf"sdf' one test"
CDATA Section:
string(48) "o'rielly, o-no, s~sdf"sdf' one test"
Encoded Entities:
string(48) "o'rielly, o-no, s~sdf"sdf' one test"
如果您使用正确的 create* 方法创建节点,DOM 将负责编码,以便您可以读取保存的相同值。
$dom = new DOMDocument();
$dom->formatOutput = TRUE;
$root = $dom->appendChild($dom->createElement('Names'));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createTextNode("O'Reilly"));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createTextNode("O'Reilly"));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createCDataSection("O'Reilly"));
echo $dom->saveXml();
输出:
<?xml version="1.0"?>
<Names>
<Name>O'Reilly</Name>
<Name>O&#39;Reilly</Name>
<Name><![CDATA[O'Reilly]]></Name>
</Names>
我正在尝试使用 DOMDocument() 加载一些 XML。我想用编码值保存 XML,但它在调用 saveXML() 时一直对其进行解码。
请看下面的代码:
$xml_str = "<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>";
$dom = new DOMDocument();
$dom->formatOutput = TRUE;
$dom->preserveWhiteSpace = FALSE;
if($dom->loadXML($xml_str)) {
$saved_XML = $dom->saveXML();
print_r("xml -> {$saved_XML}\n");
}
print_r 语句将 return:
<?xml version="1.0"?>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
我正在努力return:
<?xml version="1.0"?>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
这可以吗?
欢迎任何帮助。谢谢。
DOM 将转义所有需要的字符,但不会转义其他字符。文本节点中的引号不需要转义,所以 DOM 不会对它们进行转义。如果加载了 XML 解析器,结果将相同。
这取决于预期的结果。如果要读取特殊字符,只需让 DOM 转义需要的字符并忽略其他字符即可。它将使 XML 更易于阅读且更小。如果您需要读取实体,则必须使用 CDATA 部分或对其进行编码。
$xml = <<<'XML'
<Names>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
<Name>o'rielly, o-no, s~sdf"sdf' one test</Name>
<Name><![CDATA[o'rielly, o-no, s~sdf"sdf' one test]]></Name>
<Name>o&#39;rielly, o-no, s~sdf&quot;sdf&#39; one test</Name>
</Names>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
echo "Default:\n";
var_dump($xpath->evaluate('string(//Name[1])'));
echo "Entities:\n";
var_dump($xpath->evaluate('string(//Name[2])'));
echo "CDATA Section:\n";
var_dump($xpath->evaluate('string(//Name[3])'));
echo "Encoded Entities:\n";
var_dump($xpath->evaluate('string(//Name[4])'));
输出:
Default:
string(35) "o'rielly, o-no, s~sdf"sdf' one test"
Entities:
string(35) "o'rielly, o-no, s~sdf"sdf' one test"
CDATA Section:
string(48) "o'rielly, o-no, s~sdf"sdf' one test"
Encoded Entities:
string(48) "o'rielly, o-no, s~sdf"sdf' one test"
如果您使用正确的 create* 方法创建节点,DOM 将负责编码,以便您可以读取保存的相同值。
$dom = new DOMDocument();
$dom->formatOutput = TRUE;
$root = $dom->appendChild($dom->createElement('Names'));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createTextNode("O'Reilly"));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createTextNode("O'Reilly"));
$root
->appendChild($dom->createElement('Name'))
->appendChild($dom->createCDataSection("O'Reilly"));
echo $dom->saveXml();
输出:
<?xml version="1.0"?>
<Names>
<Name>O'Reilly</Name>
<Name>O&#39;Reilly</Name>
<Name><![CDATA[O'Reilly]]></Name>
</Names>