PHP无效字符错误


PHP invalid character error

我得到这个错误时运行这段代码: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>

元素名不能以number开头

1OhmStable  <-- rename this
_1OhmStable <-- this is fine

php解析xml - error: StartTag: invalid element name

一篇不错的文章:- http://www.xml.com/pub/a/2001/07/25/namingparts.html

名称是以一个字母或几个标点符号中的一个开头,接着是字母、数字、连字符、下划线、冒号或句号,统称为名称字符。

你还没有写你在哪里得到这个错误。如果它是在您清理值之后,这是我的猜测:

preg_replace("/[^A-Za-z0-9]/", "",$c);

这个替换不是为UTF-8编码的字符串(DOMDocument使用的)编写的。您可以使用u -修饰符(PCRE8)­Docs:

使其与UTF-8兼容。
preg_replace("/[^A-Za-z0-9]/u", "",$c);
                            ^

这只是一个猜测,我建议你在你的问题中更精确地说明你的代码的哪一部分触发了错误

即使__cleandata()将删除除拉丁字母a-z和数字以外的所有其他字符,它也不一定保证结果是有效的XML名称。你的函数可以返回以数字开头的字符串,但是数字在XML中是非法的开始字符,它们只能出现在名字的名字字符之后。此外,名称中禁止使用空格,因此这是您期望的XML输出失败的另一个原因。

确保脚本具有相同的编码:如果是UTF,请确保它们在文件的最开始没有字节顺序标记(BOM)。要做到这一点,使用文本编辑器打开XML文件,如notepad++,并将文件转换为"UTF-8 without BOM"。

我有一个类似的错误,但与json文件