运行此代码时出现此错误:
Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' in test.php:29 Stack trace: #0 test.php(29): DOMDocument->createElement('1OhmStable', 'a') #1 {main} thrown in test.php on line 29
来自原始XML文件的节点确实包含无效字符,但是当我从节点中剥离无效字符时,应该创建节点。我需要对原始XML文档进行哪种编码?我需要解码saveXML吗?
function __cleanData($c)
{
return preg_replace("/[^A-Za-z0-9]/", "",$c);
}
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->load('test.xml');
$xml->formatOutput = true;
$append = array();
foreach ($xml->getElementsByTagName('product') as $product )
{
foreach($product->getElementsByTagName('name') as $name )
{
$append[] = $name;
}
foreach ($append as $a)
{
$nodeName = __cleanData($a->textContent);
$element = $xml->createElement(htmlentities($nodeName) , 'a');
}
$product->removeChild($xml->getElementsByTagName('details')->item(0));
$product->appendChild($element);
}
$result = $xml->saveXML();
$file = "data.xml";
file_put_contents($file,$result);
这就是原始XML的样子:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?>
<products>
<product>
<modelNumber>M100</modelNumber>
<itemId>1553725</itemId>
<details>
<detail>
<name>1 Ohm Stable</name>
<value>600 x 1</value>
</detail>
</details>
</product>
</products>
新文件看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/v1/xsl/xml_pretty_printer.xsl" type="text/xsl"?>
<products>
<product>
<modelNumber>M100</modelNumber>
<itemId>1553725</itemId>
<1 Ohm Stable>
</1 Ohm Stable>
</product>
</products>
答案 0 :(得分:12)
只是您不能使用以数字
开头的元素名称1OhmStable <-- rename this
_1OhmStable <-- this is fine
php parse xml - error: StartTag: invalid element name
一篇好文章: - http://www.xml.com/pub/a/2001/07/25/namingparts.html
名称是以字母或几个标点符号之一开头的标记,并以字母,数字,连字符,下划线,冒号或句号结尾,一起称为名称字符。
答案 1 :(得分:5)
您还没有写到您收到该错误的位置。如果是在你清理了值之后,这是我的猜测:
preg_replace("/[^A-Za-z0-9]/", "",$c);
此替换不是为UTF-8编码的字符串(DOMDocument使用)编写的。您可以使用u
-modifier (PCRE8)Docs:
preg_replace("/[^A-Za-z0-9]/u", "",$c);
^
这只是一个猜测,我建议你在问题的哪一部分触发错误时更准确。
答案 2 :(得分:1)
即使__cleandata()
将删除除拉丁字母a-z和数字之外的所有其他字符,也不一定保证结果是有效的XML名称。您的函数可以返回以数字开头的字符串,但数字是XML中的非法名称 start 字符,它们只能出现在名字后面的名称中。名称中也禁止使用空格,因此这是您预期的XML输出失败的另一点。
答案 3 :(得分:0)
确保脚本具有相同的编码:如果它是UTF,请确保它们在文件的开头没有字节顺序标记(BOM)。 为此,请使用Notepad ++等文本编辑器打开XML文件,并将文件转换为“无BOM的UTF-8”。
我遇到了类似的错误,但是json file