我从某个源获取XML字符串.我创建一个DOMDocument对象并将XML字符串加载到其中(使用DOMDocument :: loadXML()).然后我使用各种方法(例如DOMXPath)浏览XML文档,直到找到我想要的节点(当然是DOMNode).
此节点有一堆的后裔,我想采取整个节点(及其后代),并从它创建一个新的DOMDocument对象.我不知道该怎么做; 我尝试创建一个新的DOMDocument并使用DOMDocument :: importNode(),但这似乎只有在DOMDocument中已经有一个主文档节点时才有效,在这种情况下它会将导入的节点作为主文档节点的子节点附加,这不是我想要的 - 我希望导入的节点成为DOMDocument主节点.
也许有一种更简单的方法(即更简单的方法来提取原始XML的一部分,我想将其转换为自己的文档),但我不知道.我对DOMDocument比较新,虽然我已经使用了SimpleXMLElement足以让它烦恼.
我需要将XML文档加载到来自外部源的PHP中.XML没有声明它的编码并包含非法字符&.如果我尝试直接在浏览器中加载XML文档,我会收到类似"在文本内容中找到无效字符"的错误,当在PHP中加载文件时,我会收到很多警告,例如:xmlParseEntityRef: no name in Entity和Input 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);
示例编码问题的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>
如何获取元素的所有属性?就像我下面的例子一样,我一次只能获得一个,我想拉出所有锚标签的属性.
$dom = new DOMDocument();
@$dom->loadHTML(http://www.example.com);
$a = $dom->getElementsByTagName("a");
echo $a->getAttribute('href');
谢谢!
我正在使用simpleXML在我的一个XML文档中添加子节点...当我在simpleXML对象上执行print_r时,<仍然<在视图源中显示为a .但是,在使用DOMDocument将此对象保存回XML后,将<转换为<并>转换为>
关于如何改变这种行为的任何想法?我试过添加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);
这是我正在使用<:
$new_hint = '<![CDATA[' . $value[0] . ']]>';               
$PrintQuestion->content->multichoice->feedback->hint->Passage->Paragraph->addChild('TextFragment', $new_hint);
问题是,我使用简单的XML来迭代XML文档中的某些节点,如果属性与给定的ID匹配,则会添加一个特定的子节点和CDATA.然后在所有处理之后,我使用DOMDocument将XML保存回文件,这是<转换为<等的地方.
这是我的整个类文件的链接,因此您可以更好地了解我正在尝试完成的任务.具体请参考底部的hint_insert()方法.
我正在DOMDocument使用该loadHTML()函数导入一些任意HTML ,例如:
$html = '<p><a href="test.php">Test</a></p>';
$doc = new DOMDocument;
$doc->loadHTML($html);
然后我想使用DOMDocument我没有问题的方法更改一些属性/节点值.
一旦我做了这些更改,我就想导出HTML字符串(使用->saveHTML()),而不会自动添加到HTML中的<html><body>...标记DOMDocument.
我理解为什么要添加这些(以确保有效的文档),但是我如何才能将我编辑的HTML(特别是<body>标签之间的所有内容)都用到了?
我已阅读这篇文章,虽然它提供了一些解决方案,但我宁愿"正确"这样做,即不在<body>标签上使用字符串替换.HTML的有效性不是问题,因为它预先通过HTML净化器运行.
有任何想法吗?谢谢.
编辑
我知道在PHP 5.3.6中$node添加了参数saveHTML(),不幸的是我坚持使用5.2.
<?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;
}
运行脚本返回
Warning: DOMDocument::loadXML(): Extra content at the end of the document in Entity, line: 1 in /Users/johnkim/get.php on line 7
我有一个可怕的算法,"删除一个节点",将其内部内容移动到其父节点(见下文)......但我认为有可能使用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 …我能找到的最好的答案是使用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();
其中输出如下:
<html><body>Test<br><a href="%7B%7Bvariable%7D%7D"></a></body></html>
是否有可能href不对属性进行百分比编码? 
如果不能直接进行,您能否建议简洁可靠的解决方法?我正在进行其他处理,并且DOMDocument的使用必须保留.那么也许是一个前/后处理技巧?
我正在使用CakePHP的Xml核心库在视图中生成XML :
$xml = Xml::build($data, array('return' => 'domdocument'));
echo $xml->saveXML();
视图由带有阵列的控制器提供:
$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', …我需要在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>
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); 
印刷品是:
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)
的[parentNode]就是(object value omitted) …