标签: domdocument

DOMElement类的对象无法转换为字符串

我尝试解析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)

有人可以帮帮我吗?

php domdocument xml-parsing

14
推荐指数
1
解决办法
2万
查看次数

PHP DOMDocument错误实体'nbsp'未定义

我使用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)

你知道如何修复这个错误吗?

提前感谢您的回答

php dom domdocument

14
推荐指数
2
解决办法
1万
查看次数

如何使用java dom从xml中删除命名空间?

我有以下代码

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)

但这不是我正在寻找的东西,我需要一些东西来完全摆脱命名空间.

任何帮助将不胜感激,谢谢,

玩笑

java xml dom xml-namespaces domdocument

13
推荐指数
3
解决办法
5万
查看次数

php domdocument获取属性值所在的节点值

说我的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"的节点值吗?

php attributes domdocument nodevalue

13
推荐指数
2
解决办法
3万
查看次数

如何从DOMXPath :: query()方法获取完整的HTML?

我有文件,我想从中提取具有未触及内容的特定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' 获取所有内容?

php domdocument

13
推荐指数
1
解决办法
2万
查看次数

Regex/DOMDocument - 匹配和替换不在链接中的文本

我需要以不区分大小写的方式查找和替换所有文本匹配项,除非文本位于锚标记内 - 例如:

<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扩展并不熟悉,并且非常感谢这个功能的一些基本示例.

php regex xpath preg-replace domdocument

12
推荐指数
2
解决办法
6366
查看次数

PHP DOMDocument :: loadHTML()[domdocument.loadhtml]:htmlParseEntityRef:实体中没有名称

我试图从某些网页获取"链接"元素.我无法弄清楚我做错了什么.我收到以下错误:

严重性:警告

消息:DOMDocument :: loadHTML()[domdocument.loadhtml]:htmlParseEntityRef:实体中没有名称,行:536

文件名:controllers/test.php

行号:34

第34行是代码中的以下内容:

      $dom->loadHTML($html);
Run Code Online (Sandbox Code Playgroud)

我的代码:

            $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)

php html-parsing domdocument

12
推荐指数
2
解决办法
4万
查看次数

如何提高迭代DOMDocument的性能?

我正在使用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)

php performance domdocument

12
推荐指数
1
解决办法
1506
查看次数

DOMDocument从HTML源中删除脚本标记

在这里使用@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 xss script-tag html-parsing domdocument

12
推荐指数
2
解决办法
9593
查看次数

PHP DOMDocument:解析非转义字符串时出错

我在使用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的答案 …

html php domdocument

12
推荐指数
2
解决办法
1159
查看次数