PHP无效字符错误

Rya*_*yan 7 php xml dom

运行此代码时出现此错误: 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);
Run Code Online (Sandbox Code Playgroud)

这就是原始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>
Run Code Online (Sandbox Code Playgroud)

新文档应该如下所示:

 <?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>
Run Code Online (Sandbox Code Playgroud)

ajr*_*eal 13

您只能使用以数字开头的元素名称

1OhmStable  <-- rename this
_1OhmStable <-- this is fine
Run Code Online (Sandbox Code Playgroud)

php parse xml - 错误:StartTag:无效的元素名称

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

名称是以字母或几个标点符号之一开头的标记,并且继续使用字母,数字,连字符,下划线,冒号或句号,一起称为名称字符.


hak*_*kre 5

你还没有写到你得到错误的地方.如果是在你清理了值之后,这是我的猜测:

preg_replace("/[^A-Za-z0-9]/", "",$c);
Run Code Online (Sandbox Code Playgroud)

此替换不是为UTF-8编码的字符串(DOMDocument使用)编写的.您可以使用u-modifier(PCRE8)文档使其与UTF-8兼容:

preg_replace("/[^A-Za-z0-9]/u", "",$c);
                            ^
Run Code Online (Sandbox Code Playgroud)

这只是一个猜测,我建议你在问题的哪一部分触发错误时更准确.