我尝试解析XML rss flux.实际上,抛出了一个错误:
Catchable fatal error: Object of class DOMElement could not be converted to string in ...
Run Code Online (Sandbox Code Playgroud)
我想获得标签"link"的值"test"
这是我的代码:
//check if url contents xml
$content = file_get_contents($flux);
$xml = new DOMDocument;
$xml->loadXML($content);
//get the link
$link = $xml->getElementsByTagName('link')->item(0);
echo $link;
Run Code Online (Sandbox Code Playgroud)
这是助焊剂:
<?xml version="1.0" encoding="ISO-8859-15" ?>
<rss version="2.0">
<channel>
<title>test</title>
<link>http://test.fr</link>
</channel>
</rss>
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
我使用DOMDocument编辑一些HTML文件,但是一些主题在其名称空间中.所以DOMDocument自动将空格更改为%20,然后找不到它们.
这就是如何准确查看错误:
Warning: DOMDocument::load() [domdocument.load]: Entity 'nbsp' not defined in file:///C:/Path/To/The/File/01%20c%2040-1964.html, line: 11 in C:/Path/To/class.php on line 51
Run Code Online (Sandbox Code Playgroud)
你知道如何修复这个错误吗?
提前感谢您的回答
我有以下代码
DocumentBuilderFactory dbFactory_ = DocumentBuilderFactory.newInstance();
Document doc_;
DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder();
StringReader reader = new StringReader(s);
InputSource inputSource = new InputSource(reader);
doc_ = dBuilder.parse(inputSource);
doc_.getDocumentElement().normalize();
Run Code Online (Sandbox Code Playgroud)
然后我就能做到
doc_.getDocumentElement();
Run Code Online (Sandbox Code Playgroud)
得到我的第一个元素,但问题是而不是job元素是tns:job.
我知道并试图使用:
dbFactory_.setNamespaceAware(true);
Run Code Online (Sandbox Code Playgroud)
但这不是我正在寻找的东西,我需要一些东西来完全摆脱命名空间.
任何帮助将不胜感激,谢谢,
玩笑
说我的XML看起来像这样:
<record>
<row name="title">this item</row>
<row name="url">this url</row>
</record>
Run Code Online (Sandbox Code Playgroud)
现在我正在做这样的事情:
$xml = new DOMDocument();
$xml->load('xmlfile.xml');
echo $xml->getElementByTagName('row')->item(0)->attributes->getNamedItem('title')->nodeValue;
Run Code Online (Sandbox Code Playgroud)
但这只是给了我:
注意:尝试获取非对象ID的属性
有人知道如何获取"name"属性具有值"title"的节点值吗?
我有文件,我想从中提取具有未触及内容的特定div.我做:
$dom = new DOMDocument();
$dom->loadHTML($string);//that's HTML of my document, string
Run Code Online (Sandbox Code Playgroud)
和xpath查询:
$xpath = new DOMXPath($dom);
$xpath_resultset = $xpath->query("//div[@class='text']");
/*I'm after div class="text"*/
Run Code Online (Sandbox Code Playgroud)
现在我按照我的item(0)方法做了一些方法$xpath_resultset
$my_content = $xpath_resultset->item(0);
Run Code Online (Sandbox Code Playgroud)
我得到的是对象(不是字符串)$ my_content我可以回显或settype()到字符串,但结果我得到的是完全剥离的标记?
该怎么做才能从div class ='text' 获取所有内容?
我需要以不区分大小写的方式查找和替换所有文本匹配项,除非文本位于锚标记内 - 例如:
<p>Match this text and replace it</p>
<p>Don't <a href="/">match this text</a></p>
<p>We still need to match this text and replace it</p>
Run Code Online (Sandbox Code Playgroud)
搜索"匹配此文本"只会替换第一个实例和最后一个实例.
[编辑]根据戈登的评论,在这个例子中可能更喜欢使用DOMDocument.我对DOMDocument扩展并不熟悉,并且非常感谢这个功能的一些基本示例.
我试图从某些网页获取"链接"元素.我无法弄清楚我做错了什么.我收到以下错误:
严重性:警告
消息:DOMDocument :: loadHTML()[domdocument.loadhtml]:htmlParseEntityRef:实体中没有名称,行:536
文件名:controllers/test.php
行号:34
第34行是代码中的以下内容:
Run Code Online (Sandbox Code Playgroud)$dom->loadHTML($html);
我的代码:
$url = "http://www.amazon.com/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
if($html = curl_exec($ch)){
// parse the html into a DOMDocument
$dom = new DOMDocument();
$dom->recover = true;
$dom->strictErrorChecking = false;
$dom->loadHTML($html);
$hrefs = $dom->getElementsByTagName('a');
echo "<pre>";
print_r($hrefs);
echo "</pre>";
curl_close($ch);
}else{
echo "The website could not be reached.";
}
Run Code Online (Sandbox Code Playgroud) 我正在使用cURL从服务器中提取网页.我将它传递给Tidy并将输出抛出到DOMDocument中.然后麻烦开始了.
该网页包含大约三千个(yikes)表标签,我正在从中抓取数据.有两种表,其中一种或多种类型B遵循类型A.
我用microtome(true)调用来描述我的脚本.我在脚本的每个阶段之前和之后都进行了调用,并相互减去了时间.所以,如果你跟着我完成我的代码,我会解释它,分享个人资料结果,并指出问题所在.也许你甚至可以帮我解决问题.开始了:
首先,我包含两个文件.一个处理一些解析,另一个定义两个"数据结构"类.
// Imports
include('./course.php');
include('./utils.php');
Run Code Online (Sandbox Code Playgroud)
据我所知,包含是无关紧要的,所以让我们继续进行cURL导入.
// Execute cURL
$response = curl_exec($curl_handle);
Run Code Online (Sandbox Code Playgroud)
我已经将cURL配置为不超时,并发布一些标题数据,这是获得有意义的响应所必需的.接下来,我清理数据以准备DOMDocument.
// Run about 25 str_replace calls here, to clean up
// then run tidy.
$html = $response;
//
// Prepare some config for tidy
//
$config = array(
'indent' => true,
'output-xhtml' => true,
'wrap' => 200);
//
// Tidy up the HTML
//
$tidy = new tidy;
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();
$html = $tidy;
Run Code Online (Sandbox Code Playgroud)
到目前为止,代码大约需要9秒钟.考虑到这是一个cron工作,不经常运行,我很好.但是,代码的下一部分确实是barfs.这是我从HTML中获取我想要的内容并将其推送到我的自定义类中.(我计划将其填入MySQL数据库,但这是第一步.)
// Get all of the tables …Run Code Online (Sandbox Code Playgroud) 我在这里使用@Alex的方法使用内置的DOMDocument从HTML文档中删除脚本标记.问题是,如果我有一个带有Javascript内容的脚本标记,然后是另一个链接到外部Javascript源文件的脚本标记,则不会从HTML中删除所有脚本标记.
$result = '
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>
hey
</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
alert("hello");
</script>
</head>
<body>hey</body>
</html>
';
$dom = new DOMDocument();
if($dom->loadHTML($result))
{
$script_tags = $dom->getElementsByTagName('script');
$length = $script_tags->length;
for ($i = 0; $i < $length; $i++) {
if(is_object($script_tags->item($i)->parentNode)) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
}
echo $dom->saveHTML();
}
Run Code Online (Sandbox Code Playgroud)
以上代码输出:
<html>
<head>
<meta charset="utf-8">
<title>hey</title>
<script>
alert("hello");
</script>
</head>
<body>
hey
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
从输出中可以看出,只删除了外部脚本标记.有什么办法可以确保删除所有脚本标记吗?
我在使用PHP的DOMDocument解析HTML时遇到了问题.
我正在解析的HMTL具有以下脚本标记:
<script type="text/javascript">
var showShareBarUI_params_e81 =
{
buttonWithCountTemplate: '<div class="sBtnWrap"><a href="#" onclick="$onClick"><div class="sBtn">$text<img src="$iconImg" /></div><div class="sCountBox">$count</div></a></div>',
}
</script>
Run Code Online (Sandbox Code Playgroud)
这个片段有两个问题:
1)buttonWithCountTemplatevar中的HTML 不会被转义.DOMDocument正确地管理它,在解析时转义字符.不是问题.
2)接近结尾,有一个img标签带有未转义的结束标签:
<img src="$iconImg" />
Run Code Online (Sandbox Code Playgroud)
该/>品牌的DOMDocument认为脚本执行完毕,但它缺少结束标记.如果使用getElementByTagName提取脚本,则会在此img标记处关闭标记,其余的将在HTML上显示为文本.
我的目标是删除此页面中的所有脚本,因此如果我执行removeChild()此标记,则会删除标记,但在呈现页面时,以下部分将显示为文本:
</div><div class="sCountBox">$count</div></a></div>',
}
</script>
Run Code Online (Sandbox Code Playgroud)
修复HTML不是一个解决方案,因为我正在开发一个通用的解析器,需要处理所有类型的HTML.
我的问题是,在将HTML提供给DOMDocument之前是否应该进行任何清理,或者是否有选项可以在DOMDocument上启用以避免触发此问题,或者即使我可以在加载HTML之前删除所有标记.
有任何想法吗?
经过一些研究,我发现了DOMDocument解析器的真正问题.请考虑以下HTML:
<div> <!-- Offending div without closing tag -->
<script type="text/javascript">
var test = '</div>';
// I should not appear on the result
</script>
Run Code Online (Sandbox Code Playgroud)
使用以下php代码删除脚本标记(基于Gholizadeh的答案 …
domdocument ×10
php ×9
dom ×2
html-parsing ×2
attributes ×1
html ×1
java ×1
nodevalue ×1
performance ×1
preg-replace ×1
regex ×1
script-tag ×1
xml ×1
xml-parsing ×1
xpath ×1
xss ×1