【问题标题】:PHP DOMDocument loadhtml. How force not to change markup?PHP DOMDocument 加载html。如何强制不更改标记?
【发布时间】:2015-10-09 09:27:53
【问题描述】:

大家好,请阅读此内容 :) 我的问题是这个$dom_doc = new DOMDocument("1.0", "utf-8")->loadHTML($doc)

$doc 看起来像:

...
<images>
 <img>
   <file>myfile.jpg</file>
   <desc>My file description</desc>
 </img>
 <img>
   <file>myfile.jpg</file>
   <desc>My file description</desc>
 </img>
</images>
...

loadHTML 将此标签转换为单个 html 标签(imglink 等)

...
<images>
 <img/>
 <file>myfile.jpg</file>
 <desc>My file description</desc>
 <img/>
 <file>myfile.jpg</file>
 <desc>My file description</desc>
</images>
...

我应该怎么做才能强制使用成对的标签? 也许loadXML(),但它不想正确使用xpath。通过选择器“//images”,显示我什么也没找到。所以我更喜欢使用loadHTML()

【问题讨论】:

    标签: php html xml domdocument


    【解决方案1】:

    这不是 HTML 而是 XML,如果您将其加载为 HTML,则 DOM 解析器必须根据 HTML 规则对其进行解析,这意味着例如 img 没有结束标记。

    我希望您的 XML 中有一些命名空间定义。如果是这种情况,您将必须为该命名空间注册一个前缀。

    $xml = <<<'XML'
    <images xmlns="urn:some-namespace">
     <img>
       <file>myfile.jpg</file>
       <desc>My file description</desc>
     </img>
    </images>
    XML;
    
    $document = new DOMDocument();
    $document->loadXml($xml);
    $xpath = new DOMXpath($document);
    $xpath->registerNamespace('x', 'urn:some-namespace');
    
    foreach ($xpath->evaluate('//x:images/x:img') as $img) {
      var_dump(
        [
          'file' => $xpath->evaluate('string(x:file)', $img),
          'desc' => $xpath->evaluate('string(x:desc)', $img)
        ]
      );
    }
    

    输出:

    array(2) {
      ["file"]=>
      string(10) "myfile.jpg"
      ["desc"]=>
      string(19) "My file description"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-02
      • 2011-05-27
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多