一聚教程网:一个值得你收藏的教程网站

热门教程

PHP 处理XML文件实例详解

时间:2022-06-24 20:49:48 编辑:袖梨 来源:一聚教程网

XML的精髓是什么呢?

XML的精髓是什么呢?
        就是我们基于信息描述的、能够体现数据信息之间逻辑关系的、可以确保文件的易读性和易搜索性的自定义标记!
       你的XML文件遵循所谓“形式良好”要求的种种语法规则,一个完全意义上的XML文件不仅应该是“形式良好的”,而且还应该是使用了这些自定义标记的“有效”的XML文件。

一个XML文件必须遵守文件类型描述DTD(Document Type Definition)中定义的种种规定。DTD实际上是“元标记”这个概念的产物,它描述了一个标记语言的语法和词汇表,也就是定义了文件的整体结构以及文件的语法。简而言之,DTD规定了一个语法分析器为了解释一个“有效的”XML文件所需要知道的所有规则的细节。


如何写一个XML文件

1. 第一个行
 2. 必须有一个最外层的标记
 3. XML标记不区分大小写,使用中文都可以, 开始标记是什么, 结束就必须是什么
 4. 所有的XML标记必须有结束
 5. 所有的属性值必须使用比引号
 6. 层次要清楚
 7. 相同标记不能嵌套
 8. 可以使用实体 & ;
 9. 注释问题
 10.

PHP如何处理XML文件


其实使用php的xml解析函数,处理xml文档无异于处理文件。只要你根据自己的具体需求编写好几个处理函数就万事大吉了。明白了xml文件的读取,那么生成xml文件也就不成问题了。需要注意的问题是注意xml文件的编码和书写规范。
 
下面是手册里的例子,确实是经典的例子,
 


     a1b1c1
     a2c2
     a3b3c3
   
  
 
 
 

  About this Document
 
  
  
 

 

 
 
 
还有一个是将xml文件处理成php数组的例子。
class AminoAcid {
    var $name;  // aa name
    var $symbol;    // three letter symbol
    var $code;  // one letter code
    var $type;  // hydrophobic, charged or neutral
  
    function AminoAcid ($aa) {
        foreach ($aa as $k=>$v)
            $this->$k = $aa[$k];
    }
}
function readDatabase($filename) {
    // read the xml database of aminoacids
    $data = implode("",file($filename));//首先将整篇文章读入数组,之后再将数组连接成字符串,赋值给$data.
    $parser = xml_parser_create();
    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);//不使用大小写折叠
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
    xml_parse_into_struct($parser,$data,$values,$tags);//将 XML 数据解析到数组中,该函数将 XML 文件解析到两个对应的数组中,
                //$tags 参数含有指向 $values 数组中对应值的指针。最后两个数组参数可由指针传递给函数。
    xml_parser_free($parser);
    // loop through the structures
    //针对具体的应用(不同的xml文件,修改此处循环结构得到具体的数组即可。
    foreach ($tags as $key=>$val) {
        if ($key == "molecule") {
            $molranges = $val;
            // each contiguous pair of array entries are the
            // lower and upper range for each molecule definition
            for ($i=0; $i < count($molranges); $i+=2) {
                    $offset = $molranges[$i] + 1;
                $len = $molranges[$i + 1] - $offset;
                $tdb[] = parseMol(array_slice($values, $offset, $len));
            }
        } else {
            continue;
        }
    }
//    echo "values is:";
//    print_r($values);
//    echo "
";
    return array($tdb,$values);
}
function parseMol($mvalues) {
    for ($i=0; $i < count($mvalues); $i++)
        $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
      
//    echo " after parsemol :";
//    print_r($mol);
//    echo "
";
    return new AminoAcid($mol);
}
$db = readDatabase("moldb.xml");
echo "** Database of AminoAcid objects:n";
   // echo " readdatabase :";
    print_r($db[0]);
   // echo "
";

$s = parseMol($db[1]);
?>
 
副 moldb.xml


   
        Alanine
        ala
        A
        hydrophobic
   

   
        Lysine
        lys
        K
        charged
   

 代码如下 复制代码

$file = "xmltest.xml";
//验证文件的合法性
function trustedFile($file) {
    // only trust local files owned by ourselves
    if (!eregi("^([a-z]+)://", $file)
        && fileowner($file) == getmyuid()) {
            return true;
    }
    return false;
}
//处理起始标记的函数。用特殊颜色标记并输出显示。
//注意$attribs为数组
function startElement($parser, $name, $attribs=array() ) {
    print "<$name";
    if (sizeof($attribs)) {
        while (list($k, $v) = each($attribs)) {
            print " $k="                    color="#990000">$v"";
        }
    }
    print ">";
}
//结束标记处理并显示
function endElement($parser, $name) {
    print "</$name>";
}
//处理数据部分
function characterData($parser, $data) {
    print "$data";
}
//处理指令(PI)处理器 参数处理函数
function PIHandler($parser, $target, $data) {
    switch (strtolower($target)) {
        case "php":
            global $parser_file;
            // If the parsed document is "trusted", we say it is safe
            // to execute PHP code inside it.  If not, display the code
            // instead.
            if (trustedFile($parser_file[$parser])) {
                eval($data);
            } else {
                printf("Untrusted PHP code: %s",
                        htmlspecialchars($data));
            }
            break;
    }
}
//默认处理句柄
function defaultHandler($parser, $data) {
    if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {//判断数据是否为外部实体,注意这种判断方法。
        printf('%s',
                htmlspecialchars($data));
    } else {
        printf('%s',
                htmlspecialchars($data));
    }
}
//外部实体处理句柄
function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,$publicId) {
    if ($systemId) {
        if (!list($parser, $fp) = new_xml_parser($systemId)) {
            printf("Could not open entity %s at %sn", $openEntityNames,
                   $systemId);
            return false;
        }
        while ($data = fread($fp, 4096)) {
            if (!xml_parse($parser, $data, feof($fp))) {
                printf("XML error: %s at line %d while parsing entity %sn",
                       xml_error_string(xml_get_error_code($parser)),
                       xml_get_current_line_number($parser), $openEntityNames);
                xml_parser_free($parser);
                return false;
            }
        }
        xml_parser_free($parser);
        return true;
    }
    return false;
}
//xml分析器。
function new_xml_parser($file) {
    global $parser_file;
    $xml_parser = xml_parser_create(); //建立一个 XML 解析器,此函数返回解释器的操作句柄。
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1); //设置是否采用大小写折叠,及目标编码
    xml_set_element_handler($xml_parser, "startElement", "endElement");//建立起始和终止元素处理器,bool
    xml_set_character_data_handler($xml_parser, "characterData");//建立字符数据处理器,bool
    xml_set_processing_instruction_handler($xml_parser, "PIHandler");//建立处理指令(PI)处理器
    xml_set_default_handler($xml_parser, "defaultHandler"); //默认处理器
    xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");//外部实体指向处理器
  
    if (!($fp = @fopen($file, "r"))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, "array");//将文件处理变量设为array类型
    }
    $parser_file[$xml_parser] = $file; //?将文件名赋值给以解释器操作句柄为索引的数组?(解释器的句柄以资源记录的形式返回)
//    echo "parser = ";
//    print_r($parser_file);
//    echo "
$xml_parser";
//    echo "
";
    return array($xml_parser, $fp); //解释器的操作句柄 和待分析文件的句柄
}
if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die("could not open XML input");
}
print "

";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {//此处采用条件赋值。当条件表达式失效时执行if处理,否则跳过。
        die(sprintf("XML error: %s at line %dn",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
print "
";
print "parse completen";
xml_parser_free($xml_parser);
?>
 
xmltest.xml文件



 Title
 
 
  
   

热门栏目