当前位置: 首页 > 知识库问答 >
问题:

无法通过xpath访问具有多个命名空间的xhtml文档中的节点

万俟玉书
2023-03-14

好的,我正在尝试用curl和xpath解析一个xhtml站点。

该网站有多个命名空间:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:addthis="http://www.addthis.com/help/api-spec"     xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml">

我试图从网站的分页中获取所有的网址,如下所示:

$url = [site_im_parsing];

$dom = new DOMDocument();
@$dom->loadHTML($url);  
$xpath = new Domxpath($dom);

$xpath->registerNamespace("x", "http://www.w3.org/1999/xhtml");

$pages = $xpath->query('//x:div[2]/x:table/x:tbody/x:tr/x:td[1]/x:a');

for ($i = 0; $i < $pages->length; $i++) {

    echo $pages->item($i)->getAttribute('href');

}

这不管用。(不带x名称空间的分页的xpath应该是正确的)。我应该注册所有名称空间并在xpath查询中以某种方式使用它们吗?

向你问好,AB

//问题更新//

这是我试图解析的页面部分:(我想要href)

<div class="pager">
    <table style="width:100%" border="0" cellspacing="0" cellpadding="0">
        <tbody>
            <tr>
                <td>
                    <span class="current">1</span>  | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">2</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=2">3</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=3">4</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=4">5</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=5">6</a> | 
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=6">7</a>        
                </td>
                <td style="text-align:right">
                    <a href="http://www.somewebsite.com/catalog?on_offer=1&amp;commodity_offset=1">Next</a>
                </td>
            </tr>
        </tbody>
    </table>
</div>

doctype是:

html PUBLIC“-//W3C//DTD XHTML 1.0过渡版//EN”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

如果这有什么不同的话...

共有2个答案

聂永怡
2023-03-14

好吧我想通了...

浏览器将插入一个隐式标记

旧xpath查询:

$xpath->query('//div[2]/table/tbody/tr/td[1]/a');

新的:

$xpath->query('//div[2]/table/tr/td[1]/a');
廉志强
2023-03-14

使用loadHTML时,我希望任何名称空间都会被忽略,所以尽量不要使用registerNamespace,然后使用$xpath-

 类似资料:
  • 我使用SpringBoot创建了一个SOAP Web服务服务器,并且我能够成功创建一个endpoint。但是,我无法创建多个endpoint并使用不同的URL访问它们。我想通过URL来访问处理该过程。 每个endpoint接收到的SOAP消息具有相同的模式。(命名空间和localpart是相同的!!!)我不想公开WSDL。 例如。 userA向以下URL发送以下SOAP消息:http://soap

  • 问题内容: 我想获取标记之间的所有内容,但是由于urn:名称空间,我不知道该怎么做。 有任何想法吗? 问题答案: 简短的答案:使用XPath 。这样:将返回 或者,您可以实现一个映射名称空间名称和URI的,并在查询之前在XPath对象上对其进行设置。 看一下这篇博客文章, 更新: 该文章已结束,您可以在webarchive上看到它 解决方案1样本: 解决方案2样本: 编辑 这是一个完整的示例,它可

  • 我有一个有趣的情况,我的XML编辑器(Oxygen,使用Xerces XML处理器)需要根标签上的前缀,但是我的JAXB XML Marshaller(也是基于Xerces的)不需要根标签上的前缀。我正在试图理解这种情况。 首先是2个模式文件: ns1.xsd ns2。xsd 目前的氧气释放(16.1)需要我称之为“版本1”的东西 版本1 如果我像下面的示例(版本1)那样删除前缀: 版本2 氧气抱

  • 我无法使用下面的XSD验证XML, XSD数据 我在用XML验证这个XSD时遇到以下错误, cvc复合型。2.4.答:发现以元素“standardHeader”开头的内容无效。应为“{standardHeader}”之一。 如何提供此标签:

  • 我使用maven-jaxb2-plugin生成java文件从wsdl之一。运行“生成源”目标后,我得到以下错误 有几个wsdl文件,我需要不同的目标包,所以我尝试使用绑定文件,但现在只有1个wsdl。 这是我的插件配置 这是装订。xjb文件 开始服务。wsdl文件 看起来问题与具有相同targetNamespace的多个xs:schema元素有关,但我找不到如何在不修改wsdl的情况下修复它。

  • 问题内容: 我想操作具有默认名称空间但没有前缀的xml文档。有没有办法使用没有名称空间uri的xpath,就像没有名称空间一样? 我相信,如果将documentBuilderFactory的namespaceAware属性设置为false,那应该是可能的。但就我而言,它不起作用。 我的理解是不正确的还是我在代码中做错了? 这是我的代码: 这是我的xml: 问题答案: 使用默认名称空间(无前缀)的文