PHP DOM文档问题(字符,文件)

时间:2013-03-06 11:30:02

标签: php xml dom

首先请原谅我,如果我的英语非常糟糕,或者我的问题听起来很愚蠢。

我通过创建和浏览页面的DOM树,提取了您在the left of this page上看到的类别。现在我想创建一个新的DOM来将它存储在我的服务器上并在本地重新加载它并加快整个过程。我决定在探索原始DOM时这样做。对原始DOM的探索是有效的,因此假设参数是正确的。

我编写此代码来创建DOM:

$curr_lev=1;
$mydom=new DOMdocument();
$curr_parent=$mydom->createElement('products');
function create_dom($name, $link, $lev){
    global $curr_lev;
    global $curr_parent;
    global $mydom;
    switch ($lev){
        case $curr_lev:
            $curr_parent->appendChild($mydom->createElement($name, $link));
            break;
        case $curr_lev-1:
            $curr_parent=$curr_padre->parentNode;
            $curr_parent->appendchild($mydom->createElemnt($name, $link));
            break;
        case $curr_lev+1:
            $curr_parent=$curr_padre->lastChild;
            $curr_parent->appendchild($mydom->createElement($name, $link));
            break;   
    }
    $curr_lev=$lev;
}

$mydom->formatOutput=TRUE;
$mydom->saveHTMLFile("products.xml");

我尝试给出一个解释:create_dom()为原始DOM的每个节点调用它。 $lev表示新节点的级别,$curr_lev它是最后添加的节点的级别,因此如果它们相等,则添加最后一个节点并且当前节点是同一父节点的子节点,如果{{1}我们必须返回一个级别,新添加的节点是最后添加的父亲的“兄弟”,如果$lev < $curr_lev当前节点是添加的最后一个节点的子节点。

第一个问题是,当我执行时,我收到此错误:

  

致命错误:C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php:71中未捕获的异常'DOMException',消息'无效字符错误'   堆栈跟踪:
  #0 C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php(71):DOMDocument-&gt; createElement('/ joomla / components ...','Arduino' )
  #1 C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php(30):create_dom('Arduino','/ joomla / components ...',1)<登记/>   #2 C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php(38):visita_raff(Object(DOMElement),1,'dl')
  #3 C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php(96):visita_raff(Object(DOMElement),0,'')
  #4 C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ index.php(21):include('C:\ Users \ Jacopo ...')#5 {main}抛出在第71行的C:\ Users \ Jacopo \ Dropbox \ Tirocinio \ xampp-portable \ htdocs \ sites \ prova \ cerca categorie.php

$lev > $curr_lev通常看起来像“arduino kit”,$name就像“/ joomla / components / virtuamart /...”

我尝试将其转换为UTF-8但它无法正常工作

我也尝试过测试并编写这段代码:

$link

我没有收到错误function create_xml(){ $mydom=new DOMdocument("1.0", "ISO-8859-1"); $primoElem=$mydom->createElement('foo'); $primoElem->appendChild($mydom->createElement('arduinio', 'http:arduino')); $mydom->formatOutput=TRUE; return $mydom->saveXML("foo.xml"); } 返回1,但没有写入文件!

我做错了什么?请考虑这是我第一次使用这些东西,所以要温柔:)

1 个答案:

答案 0 :(得分:1)

带有消息

的例外DOMException
  

无效的字符错误

表示您已尝试在元素名称中创建包含无效字符的元素(DOMDocument::createElement()):

$mydom->createElement($name, $link)
                        ^
                        |
           first parameter is the element name

在XML中并非每个名称都有效,有些甚至包含无效字符(例如空格" "或反斜杠/)或无效的字节序列,这些字符序列不是Unicode UTF- 8个范围。 PHP中的DOMDocument仅接受UTF-8作为输入。所以对于一般。如果您想深入了解哪些字符在XML元素名称中有效,您可以在How to check if string is a valid XML element name?中找到您可能需要的更多信息。

所以现在如果仔细查看错误消息的堆栈跟踪,您甚至可以发现问题:

DOMDocument->createElement('/joomla/compone...', 'Arduino') 
                            ^      ^

/字符在XML元素名称中无效。解决问题,你应该能够添加你的东西。只需使用最终有效的元素名称。