gpt4 book ai didi

php - 如何在 php DOMDocument 中导入 XML 字符串

转载 作者:可可西里 更新时间:2023-11-01 12:51:06 27 4
gpt4 key购买 nike

例如,我创建了一个 DOMDocument像那样:

<?php

$implementation = new DOMImplementation();

$dtd =
$implementation->createDocumentType
(
'html', // qualifiedName
'-//W3C//DTD XHTML 1.0 Transitional//EN', // publicId
'http://www.w3.org/TR/xhtml1/DTD/xhtml1-'
.'transitional.dtd' // systemId
);

$document = $implementation->createDocument('', '', $dtd);

$elementHtml = $document->createElement('html');
$elementHead = $document->createElement('head');
$elementBody = $document->createElement('body');
$elementTitle = $document->createElement('title');
$textTitre = $document->createTextNode('My bweb page');
$attrLang = $document->createAttribute('lang');
$attrLang->value = 'en';

$document->appendChild($elementHtml);
$elementHtml->appendChild($elementHead);
$elementHtml->appendChild($attrLang);
$elementHead->appendChild($elementTitle);
$elementTitle->appendChild($textTitre);
$elementHtml->appendChild($elementBody);

那么,现在,如果我有一些类似的 xhtml 字符串:

<?php
$xhtml = '<h1>Hello</h1><p>World</p>';

我如何在 <body> 中导入它?我的节点 DOMDocument ?

目前,我找到的唯一解决方案是这样的:

<?php
$simpleXmlElement = new SimpleXMLElement($xhtml);

$domElement = dom_import_simplexml($simpleXmlElement);

$domElement = $document->importNode($domElement, true);

$elementBody->appendChild($domElement);

这个解决方案对我来说似乎很糟糕,并且会产生一些问题,比如当我尝试使用这样的字符串时:

<?php
$xhtml = '<p>Hello&nbsp;World</p>';

好吧,我可以通过将 xhtml 实体转换为 Unicode 实体来绕过这个问题,但是它太丑了...

有什么帮助吗?

提前致谢!

相关问题:

最佳答案

问题是 DOM 不知道它应该考虑 XHTML DTD,除非您根据它验证文档。除非您这样做,否则 DOM 不知道 DTD 中定义的任何实体,也不知道其中的任何其他规则。幸运的是,我们整理了如何进行验证 in that other question , 有了这些知识你就可以做到

$document->validate(); // anywhere before importing the other DOM

然后导入

$fragment = $document->createDocumentFragment();
$fragment->appendXML('<h1>Hello</h1><p>Hello&nbsp;World</p>');
$document->getElementsByTagName('body')->item(0)->appendChild($fragment);
$document->formatOutput = TRUE;
echo $document->saveXml();

输出:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My bweb page</title>
</head>
<body>
<h1>Hello</h1>
<p>Hello&nbsp;World</p>
</body>
</html>

另一种将 XML 导入另一个 DOM 的方法是使用

$one = new DOMDocument;
$two = new DOMDocument;
$one->loadXml('<root><foo>one</foo></root>');
$two->loadXml('<root><bar><sub>two</sub></bar></root>');
$bar = $two->documentElement->firstChild; // we want to import the bar tree
$one->documentElement->appendChild($one->importNode($bar, TRUE));
echo $one->saveXml();

输出:

<?xml version="1.0"?>
<root><foo>one</foo><bar><sub>two</sub></bar></root>

但是,这不能用于

<h1>Hello</h1><p>Hello&nbsp;World</p>

因为当您将文档加载到 DOM 中时,DOM 将覆盖您之前告诉它的关于该文档的所有内容。因此,在使用 load 时,libxml(以及 SimpleXml、DOM 和 XMLReader)并不知道您指的是 XHTML。它不知道其中定义的任何实体,而是会对它们进行模糊测试。但即使字符串不包含实体,它也不是有效的 XML,因为它缺少根节点。这就是您使用片段的原因。

关于php - 如何在 php DOMDocument 中导入 XML 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4081090/

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