如何以元素列表的形式构造xml文件

Chi Tang Li

这是我的xml文件的一部分

<?xml version="1.0" encoding="ISO-8859-1" ?>
    <stati_team>         
                <team>
                    <team>Bayern Munich</team>
                    <victory>10</victory>
                    <loss>2</loss>
                    <ranking>1</ranking>
                </team>   
                <team>
                    <team>RB Leipzig</team>
                    <victory>8</victory>
                    <loss>4</loss>
                    <ranking>2</ranking>
                </team>
    </stati_team>

我的目标是像浏览器一样显示xml文件,这是我的php代码,他可以正常工作

<?php
$file = "team.xml";
$depth = 0;
        function startElement($parser, $name, $attrs){
            global $depth;
            $depth++;
            print"<br>";
        for ($i = 0; $i < $depth; $i++) {
            print "&nbsp;&nbsp;&nbsp;"; 
        }
            print "&lt;<font color=\"#0000cc\">$name</font>\n";
            print"&gt;";
        }
        function endElement($parser, $name){
            global $depth;
            $depth--;
        for ($i=0; $i <$depth ; $i++) { 
            print "&nbsp;&nbsp;&nbsp;";
        }
            print "&lt;<font color=\"#0000cc\">/$name</font>";print "&gt;<br>";
    }
function characterData($parser,$data){
    global $depth;
 for ($i = 0; $i < $depth; $i++) {
 print "&nbsp;&nbsp;&nbsp;";
    }
    print "$data";
}
$xml_parser=xml_parser_create();
    xml_set_element_handler($xml_parser,"startElement","endElement");
    xml_set_character_data_handler($xml_parser,"characterData");
    if(!($fp=fopen($file,"r"))){
        die("File XML: error");
    }
    while($data=fread($fp,4096)){
    if(!xml_parse($xml_parser,$data,feof($fp))){
    die("Error XML, ligne".xml_get_current_line_number($xml_parser)." !!!");
        }
    }
    xml_parser_free($xml_parser);
?>

输出

输出文件

XML文件的输出还不错。所以我的问题是我们如何做才能让<team>标签处于同一水平</team>的标签

亚历山大·多伯尼格

我担心您不完全了解这些功能在做什么。尝试查看我的解决方案以及php手册中的各个功能,希望它会更加清晰。如果不像我现在所了解和理解的这些功能那样添加评论,那么我今天从未听说过。

这里是解决方案:为了显示它的作用,我使用了“ +”和“ *”而不是不间断空格。

不幸的是,原件现在有很多问题。标签内的空格就是一个例子。

我更改了以下内容:

删除了characterdate函数中不必要的内容。仅认为此功能可以打印出标签之间的内容-您在这里不需要任何其他内容!

然后,我添加了一个新的全局变量$ lastaction,该变量存储了最后一个标记的类型(开始或结束)。
现在,关键部分花费了您9个小时:如果最后一个标签是结束标签,我们需要在标签上缩进等级数。而已。太简单。但是,我还花了一些时间来获得这种超级简单的解决方案。:-/

如果最后一个标签是结束标签,我还在开始标签中添加了if来删除中断。因为那看起来是错误的,而不像您的示例。我还用str_repeat()替换了令人讨厌的for(echo)循环

 <?php
    $file = "team.xml";
    $depth = 0;
    $lastaction="";
    function startElement($parser, $name, $attrs){
        global $depth,$lastaction;
        $depth++;
        if ($lastaction!="end") print"<br>";
        echo str_repeat('++', $depth);
        print "<<font color=\"#0000cc\">$name</font>>";
        $lastaction="start";
    }
    function endElement($parser, $name){
        global $depth, $lastaction;
        if ($lastaction=="end") echo str_repeat('**',$depth);
        $depth--;
        print "<<font color=\"#0000cc\">/$name</font>><br>";
     $lastaction ="end";
    }
    function characterData($parser,$data){
        print  $data;
    }
    $xml_parser=xml_parser_create();
    xml_set_element_handler($xml_parser,"startElement","endElement");
    xml_set_character_data_handler($xml_parser,"characterData");
    if(!($fp=fopen($file,"r"))){
        die("File XML: error");
    }
    while($data=fread($fp,4096)){
        if(!xml_parse($xml_parser,$data,feof($fp))){
            die("Error XML, ligne".xml_get_current_line_number($xml_parser)." !!!");
        }
    }
    xml_parser_free($xml_parser);
    ?>

结果完全正确(*和+仅用于演示,因为它们被添加到两个不同的函数中,因此您应该了解这里发生的情况-用一个或多个不间断空格替换它们,然后完成作业。;-)

+<STATI_TEAM>
++<TEAM>
+++<TEAM>Bayern Munich</TEAM>
+++<VICTORY>10</VICTORY>
+++<LOSS>2</LOSS>
+++<RANKING>1</RANKING>
**</TEAM>
++<TEAM>
+++<TEAM>RB Leipzig</TEAM>
+++<VICTORY>8</VICTORY>
+++<LOSS>4</LOSS>
+++<RANKING>2</RANKING>
**</TEAM>
*</STATI_TEAM>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以字符串形式获取 XML 元素的内容?

来自分类Dev

如何以列表形式将列表发送到txt文件?

来自分类Dev

如何以明文形式获取应用于特定文件的所有版本和标签的列表?

来自分类Dev

如何以文件形式下载获取响应

来自分类Dev

如何以sudo形式附加到文件?

来自分类Dev

如何以表形式打开sql文件?

来自分类Dev

如何以infix形式使用类型构造函数

来自分类Dev

使用Linq从XML源文件构造wpf超链接元素列表

来自分类Dev

如何以列表中的单独字符串而不是一个大列表的形式读取JSON文件

来自分类Dev

如何以列表形式查看文件并从统一家庭查看隐藏文件?

来自分类Dev

如何以动态形式遍历每个选择元素

来自分类Dev

如何以其他形式访问列表?

来自分类Dev

如何以Django形式显示过滤的选择列表

来自分类Dev

如何以心情形式显示“原因和类别”列表?

来自分类Dev

如何以其他形式访问列表?

来自分类Dev

如何以字符串形式获取XML内容

来自分类Dev

如何以xml形式提取节点js中的表数据?

来自分类Dev

如何以Notes形式显示文件系统中的图像?

来自分类Dev

如何以这种形式将csv转换为json文件?

来自分类Dev

如何以Graphql突变形式返回PDF文件?

来自分类Dev

我如何以整数形式获取文件中的str?

来自分类Dev

如何以多个块的形式读取文件,直到EOF(C ++)

来自分类Dev

如何以不同方式组合列表元素

来自分类Dev

如何以特定格式打印列表元素

来自分类Dev

如何以一致的顶点顺序从边列表构造面列表?

来自分类Dev

如何以双引号输出目录中的文件列表?

来自分类Dev

如何以双引号输出目录中的文件列表?

来自分类Dev

如何以编程方式从StateListAnimator xml文件加载指定的Animator?

来自分类Dev

如何以编程方式在Android上加载动画XML文件?

Related 相关文章

  1. 1

    如何以字符串形式获取 XML 元素的内容?

  2. 2

    如何以列表形式将列表发送到txt文件?

  3. 3

    如何以明文形式获取应用于特定文件的所有版本和标签的列表?

  4. 4

    如何以文件形式下载获取响应

  5. 5

    如何以sudo形式附加到文件?

  6. 6

    如何以表形式打开sql文件?

  7. 7

    如何以infix形式使用类型构造函数

  8. 8

    使用Linq从XML源文件构造wpf超链接元素列表

  9. 9

    如何以列表中的单独字符串而不是一个大列表的形式读取JSON文件

  10. 10

    如何以列表形式查看文件并从统一家庭查看隐藏文件?

  11. 11

    如何以动态形式遍历每个选择元素

  12. 12

    如何以其他形式访问列表?

  13. 13

    如何以Django形式显示过滤的选择列表

  14. 14

    如何以心情形式显示“原因和类别”列表?

  15. 15

    如何以其他形式访问列表?

  16. 16

    如何以字符串形式获取XML内容

  17. 17

    如何以xml形式提取节点js中的表数据?

  18. 18

    如何以Notes形式显示文件系统中的图像?

  19. 19

    如何以这种形式将csv转换为json文件?

  20. 20

    如何以Graphql突变形式返回PDF文件?

  21. 21

    我如何以整数形式获取文件中的str?

  22. 22

    如何以多个块的形式读取文件,直到EOF(C ++)

  23. 23

    如何以不同方式组合列表元素

  24. 24

    如何以特定格式打印列表元素

  25. 25

    如何以一致的顶点顺序从边列表构造面列表?

  26. 26

    如何以双引号输出目录中的文件列表?

  27. 27

    如何以双引号输出目录中的文件列表?

  28. 28

    如何以编程方式从StateListAnimator xml文件加载指定的Animator?

  29. 29

    如何以编程方式在Android上加载动画XML文件?

热门标签

归档