首先请原谅我,如果我的英语非常糟糕,或者我的问题听起来很愚蠢。
我通过创建和浏览页面的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,但没有写入文件!
我做错了什么?请考虑这是我第一次使用这些东西,所以要温柔:)
答案 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元素名称中无效。解决问题,你应该能够添加你的东西。只需使用最终有效的元素名称。