代码之家  ›  专栏  ›  技术社区  ›  Mitesh Golwala

加载XML失败:xmlParseCharRef:无效的xmlChar值

  •  1
  • Mitesh Golwala  · 技术社区  · 7 年前

    当我尝试导入xml文件时,它返回一个错误:

    xmlParseCharRef:无效的xmlChar值 4" 因为 $amp; 在xml中 <STOCKGROUP >NAME="ABC &amp; Glass" RESERVEDNAME="">

    下面是我用来读取xml文件数据的代码

    function add_product_type()
    {
        print_r($_FILES);
        if (isset($_FILES['product_type_file']) && ($_FILES['product_type_file']['error'] == UPLOAD_ERR_OK)) {
            $use_errors = libxml_use_internal_errors(true);
            $response = simplexml_load_file($_FILES['product_type_file']['tmp_name']);
            print_r($response);
            foreach($response->BODY->IMPORTDATA as $key => $value) {
                foreach($value->REQUESTDATA->TALLYMESSAGE as $key => $values) {
                    if (strstr("&amp;", $values->STOCKGROUP->attributes())) {
                        $name = str_replace("&amp;", "&", $values->STOCKGROUP->attributes());
                    }
                    else {
                        $name = $values->STOCKGROUP->attributes();
                    }
    
                    echo $name . ",";
                }
            }
    
            if ($response == false) {
                echo "Failed loading XML\n";
                foreach(libxml_get_errors() as $error) {
                    echo "\t", $error->message;
                }
            }
        }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   sba    7 年前

    XML没有HTML实体的概念。作为一名黑客,你可以 decode the entities first 具有

    $html = html_entity_decode($file_contents, ENT_QUOTES, "utf-8");
    

    然后尝试解析 $html 使用XML解析器。希望它足够宽容,因为HTML仍然不是有效的XML。

    好消息是,您可以删除 if (strstr("&amp;", 因为那是由 html_entity_decode() .

        2
  •  0
  •   Nigel Ren    7 年前

    您的XML示例与您获取错误的数据不一样,并且处理正常,但这并不意味着您的代码是正确的。在里面 你的主循环,你使用 $values->STOCKGROUP->attributes() 作为名字,但如果你 print_r() 对于这个值,您将看到它显示了所有属性值的列表,您的代码将把它们组合成一个字符串。

    SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [NAME] => Alluminium Section & Glass
                [RESERVEDNAME] => 
            )
    
    )
    

    如果只需要的NAME属性 <STOCKGROUP NAME="Alluminium Section &amp; Glass" RESERVEDNAME=""> ,然后使用 STOCKGROUP['NAME'] . 也不仅仅是替代品 &amp; 使用 html_entity_decode() 转换名称中的任何字符。

    foreach($response->BODY->IMPORTDATA as $key => $value) {
        foreach($value->REQUESTDATA->TALLYMESSAGE as $key => $values) {
            $name = html_entity_decode((string)$values->STOCKGROUP['NAME']);    
            echo $name . ",";
        }
    }
    

    此代码与您提供的输出示例。。。

    Alluminium Section & Glass,
    

    更新: 检查正在加载的文件。。。

    $data = file_get_contents($_FILES['product_type_file']['tmp_name']);
    echo $data;
    $use_errors = libxml_use_internal_errors(true);
    $response = simplexml_load_string($data);
    echo $response->asXML();