1

我对重音字母有疑问。

例如:我有一个标签,其中包含:“il mio prodotto é molto bello”。但是,输出是:“il mio prodotto”

当在 xml 中,并且有一个重音字母时,日期被删除。我有一个xml:

<?xml version="1.0" encoding="utf-8"?>

这是我的解析器代码:

<?php
class Content_Handler {
   function Content_Handler(){}
   function start_element($parser, $name, $attrs) {
       global $desc, $names, $link;
       if ($name == "PRODUCT"){
          $zupid = ($attrs["ZUPID"]);
          echo "$zupid<br>";
       }
       if ($name == "DESCRIPTION") { $desc = true;}
       if ($name == "NAME") { $names = true;}
       if ($name == "DEEPLINK") { $link = true;}
   }

   function end_element($parser, $name) {
       if ($name == "PRODUCT") {
          print "<br />";
       }
   }


   function characters($parser, $chars) {
       global $desc, $names, $link;
       if ($desc) { echo $chars."<br>"; $desc = false;} 
       if ($names) { echo $chars."<br>"; $names = false;} 
       if ($link) { echo $chars."<br>"; $link = false;} 
   }
}


$handler = new Content_Handler();
$cat_parser = xml_parser_create("UTF-8");

xml_parser_set_option($cat_parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
xml_set_object($cat_parser, $handler);
xml_set_element_handler($cat_parser, "start_element", "end_element");
xml_set_character_data_handler($cat_parser, "characters");


$file = "my.xml";


if ($file_stream = fopen($file, "r")) {

   while ($data = fread($file_stream, 4096)) {

       $this_chunk_parsed = xml_parse($cat_parser, $data, feof($file_stream));
       if (!$this_chunk_parsed) {
           $error_code = xml_get_error_code($cat_parser);
           $error_text = xml_error_string($error_code);
           $error_line = xml_get_current_line_number($cat_parser);

           $output_text = "Parsing problem at line $error_line: $error_text";
           die($output_text);
       }
   }
} else {

    die("Can't open XML file.");

}
xml_parser_free($cat_parser);

?>
4

1 回答 1

2

这是处理看似任何语言的 SAX 解析时的正常错误(请参阅先前关于 java 和 C 的答案!)。

当您在解析 SAX 事件时,Characters 函数并不是开始和结束标记之间元素的全部内容,它可以被多次调用,而当您处理重音字符时,它就是。

完整的字符内容只能通过连接开始和结束标记之间的值来确定。

因此,对于您的术语“il mio prodotto é molto bello”,字符可能会被调用 3 次,分别为 'il mio prodotto '、'é' 和 'molto bello',因此您需要将它们连接起来,而不是将它们用作 litterals .

您的“字符”功能应该更像:

function characters($parser, $chars) {
   global $desc, $names, $link;
   $fullchars .= $chars;
}

在 end_element 和 start_element 中使用和重置您的字符。

于 2012-06-20T10:05:33.057 回答