0

我通过创建和探索页面的 DOM 树提取了您在此页面左侧看到的类别。现在我想创建一个新的 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的层级,是最后添加的节点的层级,所以如果它们相等,最后添加的节点和当前节点是同一个父亲的子节点,如果$lev < $curr_lev我们必须返回一层和新添加的节点如果$lev > $curr_lev当前节点是最后添加的节点的子节点,则为最后添加的父节点的“兄弟”。

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

致命错误:在 C:\Users\Jacopo\Dropbox\Tirocinio\xampp-portable\htdocs\sites\prova\cerca categorie.php:71
堆栈跟踪:
#0 C:中未捕获的异常“DOMException”和消息“无效字符错误”: \Users\Jacopo\Dropbox\Tirocinio\xampp-portable\htdocs\sites\prova\cerca categorie.php(71): DOMDocument->createElement('/joomla/compone...', 'Arduino')
#1 C: \Users\Jacopo\Dropbox\Tirocinio\xampp-portable\htdocs\sites\prova\cerca categorie.php(30): create_dom('Arduino', '/joomla/compone...', 1)
#2 C:\用户\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(对象(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

$name通常看起来像“arduino kit”, $link就像“/joomla/componenent/virtuamart/...”

我已经尝试将其转换为 UTF-8,但它不会工作

我还尝试进行测试并编写以下代码:

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");
}

我没有收到错误saveXML()返回 1,但文件中没有写入任何内容!

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

4

1 回答 1

1

DOMException消息的异常

无效字符错误

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

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

在 XML 中,并非每个名称都是有效的,有些甚至包含无效字符(例如空格" "或反斜杠/)或不属于 Unicode UTF-8 范围的无效字节序列。PHP 中的 DOMDocument 仅接受 UTF-8 作为输入。所以对于一般来说。如果您想深入了解 XML 元素名称中哪些字符是有效的,您可以在如何检查字符串是否是有效的 XML 元素名称?.

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

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

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

于 2013-03-06T13:04:24.057 回答