标签: domdocument

从PHP中的DOMNode创建DOMDocument

我从某个源获取XML字符串.我创建一个DOMDocument对象并将XML字符串加载到其中(使用DOMDocument :: loadXML()).然后我使用各种方法(例如DOMXPath)浏览XML文档,直到找到我想要的节点(当然是DOMNode).

此节点有一堆的后裔,我想采取整个节点(及其后代),并从它创建一个新的DOMDocument对象.我不知道该怎么做; 我尝试创建一个新的DOMDocument并使用DOMDocument :: importNode(),但这似乎只有在DOMDocument中已经有一个主文档节点时才有效,在这种情况下它会将导入的节点作为主文档节点的子节点附加,这不是我想要的 - 我希望导入的节点成为DOMDocument主节点.

也许有一种更简单的方法(即更简单的方法来提取原始XML的一部分,我想将其转换为自己的文档),但我不知道.我对DOMDocument比较新,虽然我已经使用了SimpleXMLElement足以让它烦恼.

php xml dom domdocument

8
推荐指数
1
解决办法
6461
查看次数

在使用DOMDocument函数进行处理之前,在PHP中修复格式错误的XML

我需要将XML文档加载到来自外部源的PHP中.XML没有声明它的编码并包含非法字符&.如果我尝试直接在浏览器中加载XML文档,我会收到类似"在文本内容中找到无效字符"的错误,当在PHP中加载文件时,我会收到很多警告,例如:xmlParseEntityRef: no name in EntityInput is not proper UTF-8, indicate encoding ! Bytes: 0x9C 0x31 0x21 0x3C.

很明显,XML格式不正确,并且包含应转换为XML实体的非法字符.

这是因为XML提要由许多其他用户提供的数据组成,显然它在我获得之前没有经过验证或重新格式化.

我已经与XML feed的供应商交谈了,他们说他们正试图让内容提供商对其进行排序,但这看起来很愚蠢,因为他们应该首先验证输入.

我基本上需要修复XML纠正任何编码错误并将任何非法字符转换为XML实体,以便在使用PHP的DOMDocument函数时XML加载问题.

我的代码目前看起来像:

  $feedURL = '3704017_14022010_050004.xml';
  $dom = new DOMDocument();
  $dom->load($feedURL);
Run Code Online (Sandbox Code Playgroud)

示例编码问题的XML文件示例(单击下载):feed.xml

包含尚未转换为XML实体的字符的示例XML:

<?xml version="1.0"?>
<feed>
<RECORD>
<ID>117387</ID>
<ADVERTISERNAME>Test</ADVERTISERNAME>
<AID>10544740</AID>
<NAME>This & This</NAME>
<DESCRIPTION>For one day only this is > than this.</DESCRIPTION>
</RECORD>
</feed>
Run Code Online (Sandbox Code Playgroud)

php xml domdocument

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

PHP:DomElement-> getAttribute

如何获取元素的所有属性?就像我下面的例子一样,我一次只能获得一个,我想拉出所有锚标签的属性.

$dom = new DOMDocument();
@$dom->loadHTML(http://www.example.com);

$a = $dom->getElementsByTagName("a");
echo $a->getAttribute('href');
Run Code Online (Sandbox Code Playgroud)

谢谢!

php dom domdocument

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

如何防止DOMDocument保存<as&lt

我正在使用simpleXML在我的一个XML文档中添加子节点...当我在simpleXML对象上执行print_r时,<仍然<在视图源中显示为a .但是,在使用DOMDocument将此对象保存回XML后,将<转换为&lt;>转换为&gt;

关于如何改变这种行为的任何想法?我试过添加dom->substituteEntities = false;,但这没有用.

    //Convert SimpleXML element to DOM and save
    $dom = new DOMDocument('1.0');
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput = false;
    $dom->substituteEntities = false;
    $dom->loadXML($xml->asXML());
    $dom->save($filename);
Run Code Online (Sandbox Code Playgroud)

这是我正在使用<:

$new_hint = '<![CDATA[' . $value[0] . ']]>';               
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint);
Run Code Online (Sandbox Code Playgroud)

问题是,我使用简单的XML来迭代XML文档中的某些节点,如果属性与给定的ID匹配,则会添加一个特定的子节点和CDATA.然后在所有处理之后,我使用DOMDocument将XML保存回文件,这是<转换为<等的地方.

这是我的整个类文件的链接,因此您可以更好地了解我正在尝试完成的任务.具体请参考底部的hint_insert()方法.

http://pastie.org/1079562

php xml simplexml domdocument

8
推荐指数
1
解决办法
6074
查看次数

将DOMDocument中的特定元素导出为字符串

我正在DOMDocument使用该loadHTML()函数导入一些任意HTML ,例如:

$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument;
$doc->loadHTML($html);
Run Code Online (Sandbox Code Playgroud)

然后我想使用DOMDocument我没有问题的方法更改一些属性/节点值.

一旦我做了这些更改,我就想导出HTML字符串(使用->saveHTML()),而不会自动添加到HTML中的<html><body>...标记DOMDocument.

我理解为什么要添加这些(以确保有效的文档),但是我如何才能将我编辑的HTML(特别是<body>标签之间的所有内容)都用到了?

我已阅读这篇文章,虽然它提供了一些解决方案,但我宁愿"正确"这样做,即不在<body>标签上使用字符串替换.HTML的有效性不是问题,因为它预先通过HTML净化器运行.

有任何想法吗?谢谢.

编辑

我知道在PHP 5.3.6中$node添加了参数saveHTML(),不幸的是我坚持使用5.2.

html php domdocument

8
推荐指数
1
解决办法
3787
查看次数

PHP:实体中文档末尾的额外内容,试图提取nodeValue

<?php

echo getValue('<a>dk</a><b>sh</b>', 'a');

function getValue($string, $tagname) {
    $dom = new DomDocument();
    $dom->loadXML($string);
    $node_list = $dom->getElementsByTagName($tagname)->item(0);
    return $node_list->nodeValue;
}
Run Code Online (Sandbox Code Playgroud)

运行脚本返回

Warning: DOMDocument::loadXML(): Extra content at the end of the document in Entity, line: 1 in /Users/johnkim/get.php on line 7
Run Code Online (Sandbox Code Playgroud)

php domdocument

8
推荐指数
1
解决办法
9508
查看次数

如何使用DOMDocumentFragment移动内部内容?

我有一个可怕的算法,"删除一个节点",将其内部内容移动到其父节点(见下文)......但我认为有可能使用DOMDocumentFragment开发一个更好的算法(而不是使用saveXML/loadXML).

下面的算法受renameNode()的启发.

 /**
  * Move the content of the $from node to its parent node.
  * Conditions: parent not a document root, $from not a text node.  
  * @param DOMElement $from to be removed, preserving its contents.
  * @return true if changed, false if not.
  */
 function moveInner($from) {
     $to = $from->parentNode;
     if ($from->nodeType==1 && $to->parentNode->nodeType==1) {     
        // Scans $from, and record information:
        $lst = array(); // to avoid "scan bugs" of DomNodeList iterator …
Run Code Online (Sandbox Code Playgroud)

php innerhtml domdocument

8
推荐指数
1
解决办法
742
查看次数

使用PHP的DOMDocument时,避免使用百分比编码href属性

我能找到的最好的答案是使用XSLT,但我不知道如何将这些答案应用于我的问题.

基本上,DOMDocument在href传递传入的URL(在属性中)方面做得很好,但我实际上是用它来构建一个Twig/Django样式模板,而我宁愿让它们独自存在.这是一个具体的例子,说明了"问题":

<?php
$doc = new DOMDocument();
$doc->loadHTML('<html><body>Test<br><a href="{{variable}}"></a></body></html>');
echo $doc->saveHTML();
Run Code Online (Sandbox Code Playgroud)

其中输出如下:

<html><body>Test<br><a href="%7B%7Bvariable%7D%7D"></a></body></html>
Run Code Online (Sandbox Code Playgroud)

是否有可能href不对属性进行百分比编码?

如果不能直接进行,您能否建议简洁可靠的解决方法?我正在进行其他处理,并且DOMDocument的使用必须保留.那么也许是一个前/后处理技巧?

html php xslt domdocument percent-encoding

8
推荐指数
1
解决办法
607
查看次数

CakePHP Xml实用程序库触发DOMDocument警告

我正在使用CakePHP的Xml核心库在视图中生成XML :

$xml = Xml::build($data, array('return' => 'domdocument'));
echo $xml->saveXML();
Run Code Online (Sandbox Code Playgroud)

视图由带有阵列的控制器提供:

$this->set(
    array(
        'data' => array(
            'root' => array(
                array(
                    '@id' => 'A & B: OK',
                    'name' => 'C & D: OK',
                    'sub1' => array(
                        '@id' => 'E & F: OK',
                        'name' => 'G & H: OK',
                        'sub2' => array(
                            array(
                                '@id' => 'I & J: OK',
                                'name' => 'K & L: OK',
                                'sub3' => array(
                                    '@id' => 'M & N: OK',
                                    'name' => 'O & P: OK', …
Run Code Online (Sandbox Code Playgroud)

php xml cakephp domdocument cakephp-2.2

8
推荐指数
2
解决办法
7311
查看次数

使用DomDocument PHP获取Xpath父节点?

我需要在php中获取特定节点的父节点.我正在使用DomDocument和Xpath.我的xml是这样的:

<ProdCategories>
<ProdCategory>

    <Id>138</Id>

    <Name>Parent Category</Name>

    <SubCategories>

        <ProdCategory>

            <Id>141</Id>

            <Name>Category child</Name>

        </ProdCategory>
   </SubCategories>
</ProdCategory>
</ProdCategories>
Run Code Online (Sandbox Code Playgroud)

php代码:

$dom = new DOMDocument();
$dom->load("ProdCategories_small.xml");
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//ProdCategory/Id[.="141"]/parent::*')->item(0);
print_r($nodes); 
Run Code Online (Sandbox Code Playgroud)

印刷品是:

DOMElement Object ( 
[tagName] => ProdCategory [schemaTypeInfo] => [nodeName] => ProdCategory [nodeValue] => 141 Category child [nodeType] => 1 [parentNode] => (object value omitted) [childNodes] => (object value omitted) [firstChild] => (object value omitted) [lastChild] => (object value omitted) [previousSibling] => (object value omitted)
Run Code Online (Sandbox Code Playgroud)

[parentNode]就是(object value omitted) …

php xml xpath domdocument

8
推荐指数
2
解决办法
4095
查看次数

标签 统计

domdocument ×10

php ×10

xml ×5

dom ×2

html ×2

cakephp ×1

cakephp-2.2 ×1

innerhtml ×1

percent-encoding ×1

simplexml ×1

xpath ×1

xslt ×1