【问题标题】:PHP invalid character errorPHP无效字符错误
【发布时间】:2011-12-15 17:22:59
【问题描述】:

运行此代码时出现此错误: 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>

【问题讨论】:

  • 你就像在自言自语,XML在哪里?
  • 为什么要发布干净的版本?
  • 您发布的xml是在您删除无效字符之后?为什么不发布原始版本?
  • 不,那是原始版本。我将发布输出应该是什么样子。

标签: php xml dom


【解决方案1】:

只是你不能使用以数字开头的元素名称

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

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

【讨论】:

    【解决方案2】:

    你还没有写出你得到那个错误的地方。如果是在您清除值之后,这是我的猜测:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        确保脚本具有相同的编码:如果是 UTF,请确保它们在文件开头没有字节顺序标记 (BOM)。 为此,请使用 Notepad++ 等文本编辑器打开您的 XML 文件,并将您的文件转换为“UTF-8 without BOM”。

        我也遇到了类似的错误,但出现了json file

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-16
          • 1970-01-01
          • 1970-01-01
          • 2017-12-20
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多