有些东西我不完全了解使用PHP的DOM api进行节点克隆.这是一个示例文件,可以快速复制我遇到的问题.
$doc = new DOMDocument( '1.0', 'UTF-8' );
$root = $doc->createElement( 'root' ); // This doesn't work either $root = new DOMElement( 'root' );
$doc->appendChild( $root );
$doc2 = new DOMDocument( '1.0', 'UTF-8' );
$root2 = $doc2->createElement( 'root2' );
$doc2->appendChild( $root2 );
// Here comes the error
$root2->appendChild( $root->cloneNode() );
Run Code Online (Sandbox Code Playgroud)
当您运行此小片段时,会抛出异常
致命错误:未捕获的异常'DOMException',消息'Wrong Document Error'
我是否可以从文档中获取节点,克隆它,然后将其附加到另一个文档?
有没有什么方法可以在没有内容编码的情况下将HTML模板插入现有DOMNode?
我试过这样做:
$dom->createElement('div', '<h1>Hello world</h1>');
$dom->createTextNode('<h1>Hello world</h1>');
Run Code Online (Sandbox Code Playgroud)
输出几乎相同,唯一的区别是第一个代码将它包装在div中.我试图从字符串加载HTML,但我不知道如何将它的正文内容附加到另一个DOMDocument.
在javascript中,这个过程看起来非常简单明了.
我有这个HTML代码:
<html>
<head>
...
</head>
<body>
<div>
<div class="foo" data-type="bar">
SOMECONTENTWITHMORETAGS
</div>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)
我已经可以使用此函数获取"foo"元素(但仅包含其内容):
private function get_html_from_node($node){
$html = '';
$children = $node->childNodes;
foreach ($children as $child) {
$tmp_doc = new DOMDocument();
$tmp_doc->appendChild($tmp_doc->importNode($child,true));
$html .= $tmp_doc->saveHTML();
}
return $html;
}
Run Code Online (Sandbox Code Playgroud)
但我想返回DOMElement的所有html标签(包括其属性).我怎么能这样做?
在我的代码中,我看到了这个:
if (document.getElementById('xx') !=null) {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
如果xx未定义元素,这将评估为true还是false?
我应该写:
if (document.getElementById('xx'))
Run Code Online (Sandbox Code Playgroud)
安全吗?
这是我的代码,它将现有的XML文件或字符串加载到DOMDocument对象中:
$doc = new DOMDocument();
$doc->formatOutput = true;
// the content actually comes from an external file
$doc->loadXML('<rss version="2.0">
<channel>
<title></title>
<description></description>
<link></link>
</channel>
</rss>');
$doc->getElementsByTagName("title")->item(0)->appendChild($doc->createTextNode($titleText));
$doc->getElementsByTagName("description")->item(0)->appendChild($doc->createTextNode($descriptionText));
$doc->getElementsByTagName("link")->item(0)->appendChild($doc->createTextNode($linkText));
Run Code Online (Sandbox Code Playgroud)
我需要覆盖标题,描述和链接标记内的值.上面代码中的最后三行是我尝试这样做的; 但似乎如果节点不为空,则文本将"附加"到现有内容.如何清空节点的文本内容并在一行中添加新文本.
我刚刚开始阅读有关DOM的文档和示例,以便抓取和解析文档.
例如,我有部分文件如下所示:
<div id="showContent">
<table>
<tr>
<td>
Crap
</td>
</tr>
<tr>
<td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td>
<td width="10"> </td>
<td valign="top"><table cellspacing="0" cellpadding="0" border="0">
<tbody><tr>
<td height="30"><a class="px11" href="link">title</a><a><br>
<span class="px10"></span>
</a></td>
</tr>
<tr>
<td><img height="1" width="580" src="crap"></td>
</tr>
<tr>
<td align="right">
<a href="link"><img height="16" border="0" width="65" src="/buy"></a>
</td>
</tr>
<tr>
<td valign="top" class="px10">
<p style="width: 500px;">description.</p>
</td>
</tr>
</tbody></table></td>
</tr>
<tr>
<td>
Crap
</td>
</tr>
<tr>
<td>
Crap
</td>
</tr>
</table>
</div>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下代码来获取所有tr标记并分析其中是否存在垃圾或信息:
$dom …Run Code Online (Sandbox Code Playgroud) 我正在使用DOMDocument生成一个新的XML文件,我希望文件的输出很好地缩进,以便人类读者很容易理解.
例如,DOMDocument输出此数据时:
<?xml version="1.0"?>
<this attr="that"><foo>lkjalksjdlakjdlkasd</foo><foo>lkjlkasjlkajklajslk</foo></this>
Run Code Online (Sandbox Code Playgroud)
我希望XML文件是:
<?xml version="1.0"?>
<this attr="that">
<foo>lkjalksjdlakjdlkasd</foo>
<foo>lkjlkasjlkajklajslk</foo>
</this>
Run Code Online (Sandbox Code Playgroud)
我一直在寻找答案,我发现的所有内容似乎都试图以这种方式控制白色空间:
$foo = new DOMDocument();
$foo->preserveWhiteSpace = false;
$foo->formatOutput = true;
Run Code Online (Sandbox Code Playgroud)
但这似乎没有做任何事情.也许这只适用于阅读XML?请记住,我正在尝试编写新文档.
有什么内置的DOMDocument可以做到这一点?或者可以轻松实现这一目标的功能?
如果我在html页面中做出选择,我会:
var a = document.getSelection()
Run Code Online (Sandbox Code Playgroud)
我得到一个具有四个属性的对象:
前三个的值是相同的,即我选择的文本但它们有何不同以及使用哪个?
我试图用"getElementsByTagName"来做它,但是它不起作用,我是新手使用DOMDocument来解析HTML,因为我曾经使用正则表达式直到昨天在这里有一些类型的fokes告诉我DOMEDocument会更好用于工作,所以我试一试:)
我谷歌周围寻找一些解释,但没有找到任何帮助(不管怎么样)
所以我想捕获"捕获此文本1"和"捕获此文本2"等.
看起来不难,但我想不出来:(
<div class="main">
<div class="text">
Capture this text 1
</div>
</div>
<div class="main">
<div class="text">
Capture this text 2
</div>
</div>
Run Code Online (Sandbox Code Playgroud) 是否有一个选项与DomDocument删除第一行:
<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)
类实例化自动将它添加到输出中,但是可以摆脱它吗?
domdocument ×10
php ×8
dom ×3
xml ×3
html ×2
javascript ×2
dom-node ×1
html-parsing ×1
html5 ×1
indentation ×1
nodes ×1
parsing ×1
rss ×1
whitespace ×1
xml-parsing ×1