PHP XML到动态表

PHP XML到动态表,php,xml,dynamic,xmltable,Php,Xml,Dynamic,Xmltable,我试图创建一个基于XML的动态表。输出的XML如下所示: <tickets xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <status>1</status> <message> <ticketpage>

我试图创建一个基于XML的动态表。输出的XML如下所示:

<tickets xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <status>1</status>
    <message>
        <ticketpage>
            <ticket>
                <row1>0-10-27-30-45-0-0-0-80</row1>
                <row2>0-15-0-38-0-51-62-0-85</row2>
                <row3>5-0-0-37-0-57-60-77-0</row3>
            </ticket>
            <ticket>
                <row1>0-0-20-33-0-56-68-0-90</row1>
                <row2>8-0-0-0-49-0-64-71-84</row2>
                <row3>1-18-22-32-0-59-0-0-0</row3>
            </ticket>
            <ticket>
                <row1>0-0-23-0-47-58-67-0-86</row1>
                <row2>4-16-0-0-43-53-0-0-88</row2>
                <row3>3-0-28-35-0-0-65-72-0</row3>
            </ticket>
            <ticket>
                <row1>0-19-26-0-48-52-0-74-0</row1>
                <row2>0-0-21-0-40-0-63-75-82</row2>
                <row3>9-11-0-34-41-0-0-76-0</row3>
            </ticket>
            <ticket>
                <row1>0-12-29-36-44-0-0-78-0</row1>
                <row2>6-14-0-39-0-0-69-0-89</row2>
                <row3>2-0-0-0-0-54-66-70-81</row3>
            </ticket>
            <ticket>
                <row1>0-17-25-0-46-0-0-73-87</row1>
                <row2>0-0-24-0-42-50-61-79-0</row2>
                <row3>7-13-0-31-0-55-0-0-83</row3>
            </ticket>
        </ticketpage>
    </message>
</tickets>

1.
0-10-27-30-45-0-0-0-80
0-15-0-38-0-51-62-0-85
5-0-0-37-0-57-60-77-0
0-0-20-33-0-56-68-0-90
8-0-0-0-49-0-64-71-84
1-18-22-32-0-59-0-0-0
0-0-23-0-47-58-67-0-86
4-16-0-0-43-53-0-0-88
3-0-28-35-0-0-65-72-0
0-19-26-0-48-52-0-74-0
0-0-21-0-40-0-63-75-82
9-11-0-34-41-0-0-76-0
0-12-29-36-44-0-0-78-0
6-14-0-39-0-0-69-0-89
2-0-0-0-0-54-66-70-81
0-17-25-0-46-0-0-73-87
0-0-24-0-42-50-61-79-0
7-13-0-31-0-55-0-0-83
每个“票证”都是一个新表,每个“行”都是一行,行中的每个数字都是一列(0除外,它将是一个空单元格)

我知道我应该使用PHP的SimpleXML,但我不知道如何使用

我该怎么做呢

您可以尝试以下方法:

<?php
$str = '<tickets xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <status>1</status>
            <message>
                <ticketpage>
                    <ticket>
                        <row>0-10-27-30-45-0-0-0-80</row>
                        <row>0-15-0-38-0-51-62-0-85</row>
                        <row>5-0-0-37-0-57-60-77-0</row>
                    </ticket>
                </ticketpage>
            </message>
        </tickets>';
$dom = new SimpleXMLElement($str);
foreach ($dom->message->ticketpage->ticket as $ticket) {
    echo '<table border=1>';
    foreach($ticket->row as $row){
        $cellList = explode('-',$row);
        echo '<tr>';
        foreach ($cellList as $cell){
            echo '<td>', $cell, '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}
您可以尝试以下方法:

<?php
$str = '<tickets xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <status>1</status>
            <message>
                <ticketpage>
                    <ticket>
                        <row>0-10-27-30-45-0-0-0-80</row>
                        <row>0-15-0-38-0-51-62-0-85</row>
                        <row>5-0-0-37-0-57-60-77-0</row>
                    </ticket>
                </ticketpage>
            </message>
        </tickets>';
$dom = new SimpleXMLElement($str);
foreach ($dom->message->ticketpage->ticket as $ticket) {
    echo '<table border=1>';
    foreach($ticket->row as $row){
        $cellList = explode('-',$row);
        echo '<tr>';
        foreach ($cellList as $cell){
            echo '<td>', $cell, '</td>';
        }
        echo '</tr>';
    }
    echo '</table>';
}

我在问题中给出了一个广泛的示例,演示了如何动态操作包含编码数据的SimpleXMLElement,将其转换为更易访问的数据

在您的例子中也可以这样做,不过这次我想展示一下如何使用自定义迭代器来实现这一点

但是首先让我们考虑表是如何表示的:表由行和列组成。所以我们可以迭代行,每一行都可以是列的迭代器

关于你的问题,还有另一个迭代器在表上。因此,在伪代码中,这可能看起来像:

foreach($tables as $table)
{
    foreach ($table as $rows) {
        foreach ($rows as $column) {
        }
    }
}
在这附近做输出。例如,如果我们有一个迭代器,它能够迭代行和列,从而将is转换为一个表(例如,到目前为止,作为演示目的的纯文本),那么伪代码可以简化为:

foreach($tables as $table)
{
    echo new TextTable($table);
}
如本例所示,问题已经减少到只显示一个表,因为所有表都遵循相同的结构。我现在不显示
TextTable
工作,不需要进一步关注。如果您正在寻找一个迭代器,该迭代器在相同的迭代之后输出一个HTML表,请参见上面的链接问题,它有一个
HtmlTableIterator
,它完成了大部分工作。但是现在,让我们看看如何在行和列上创建迭代器

为此,我将向您介绍一个名为的现有迭代器类。它允许在迭代中装饰每个当前元素。这是非常灵活的,因为我们可以使用它以非常灵活的方式在很小的步骤中组成最终的表迭代器

让我们一步一步地解决你面临的所有问题。首先,需要一个函数将数字0转换为空字符串。让我们为此创建一个函数(如果需要,我还可以通过在前缀中添加空格来增加一些格式,以获得两个长度):

下一个要解决的问题是将数字的
simplexmlement
转换为那些格式化的数字。让我们也编写它,并使用前面的函数帮助完成:

$numbersToArray = function($stringNumbers) use ($formatNumber) {
    return array_map($formatNumber, explode('-', $stringNumbers));
};
哇,太短了。下一个要解决的问题是将单个表的所有行转换为这些数字数组。好的,同样地,我们利用最后一个函数:

$tableToRows = function(SimpleXMLElement $table) use ($numbersToArray) {
    return new DecoratingIterator($table->children(), $numbersToArray);
};
最后还有一个问题:需要将整个XML转换为所有表的迭代器。同样,使用前面的功能,这也更容易:

$tables = new DecoratingIterator(
    $xml->message->ticketpage->ticket,
    $tableToRows
);
哇。可能有点长,让我们回顾一下:

$formatNumber = function($number)
{
    if ($number === '0') {
        $number = '';
    }

    return sprintf("%' 2s", $number);
};

$numbersToArray = function(SimpleXMLElement $stringNumbers) use ($formatNumber) {
    return array_map($formatNumber, explode('-', $stringNumbers));
};

$tableToRows = function(SimpleXMLElement $table) use ($numbersToArray) {
    return new DecoratingIterator($table->children(), $numbersToArray);
};

$tables = new DecoratingIterator(
    $xml->message->ticketpage->ticket,
    $tableToRows
);
所有这些代码行都是为了提供我们可以用来显示表的
$tables
迭代器。因此,为了使其更易于使用,我们将其封装到自己的类中,并向PHP发出信号,表明该类可以聚合一个迭代器,该迭代器通过
IteratorAggregate
接口工作:

class TableAggregator implements IteratorAggregate
{
    private $xml;

    public function __construct(SimpleXMLElement $xml)
    {
        $this->xml = $xml;
    }

    public function getIterator() 
    {
        # ... code to create the tables iterator

        return $tables;
    }
}
好吧,到目前为止这可能是很多。现在最好显示使用示例,以说明为什么聚合在这里有意义:

$xml = simplexml_load_file('example.xml');

$tables = new TableAggregator($xml);

foreach ($tables as $table) {
    echo new TextTable($table), "\n";
}
如本例所示,这是因为它易于使用。另外,如果我们有不同的格式需求,我们可以创建一个不同的格式,就是这么简单。让我们看看示例性输出:

+--+--+--+--+--+--+--+--+--+
|  |10|27|30|45|  |  |  |80|
+--+--+--+--+--+--+--+--+--+
|  |15|  |38|  |51|62|  |85|
+--+--+--+--+--+--+--+--+--+
| 5|  |  |37|  |57|60|77|  |
+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+
|  |  |20|33|  |56|68|  |90|
+--+--+--+--+--+--+--+--+--+
| 8|  |  |  |49|  |64|71|84|
+--+--+--+--+--+--+--+--+--+
| 1|18|22|32|  |59|  |  |  |
+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+
|  |  |23|  |47|58|67|  |86|
+--+--+--+--+--+--+--+--+--+
| 4|16|  |  |43|53|  |  |88|
+--+--+--+--+--+--+--+--+--+
| 3|  |28|35|  |  |65|72|  |
+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+
|  |19|26|  |48|52|  |74|  |
+--+--+--+--+--+--+--+--+--+
|  |  |21|  |40|  |63|75|82|
+--+--+--+--+--+--+--+--+--+
| 9|11|  |34|41|  |  |76|  |
+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+
|  |12|29|36|44|  |  |78|  |
+--+--+--+--+--+--+--+--+--+
| 6|14|  |39|  |  |69|  |89|
+--+--+--+--+--+--+--+--+--+
| 2|  |  |  |  |54|66|70|81|
+--+--+--+--+--+--+--+--+--+

+--+--+--+--+--+--+--+--+--+
|  |17|25|  |46|  |  |73|87|
+--+--+--+--+--+--+--+--+--+
|  |  |24|  |42|50|61|79|  |
+--+--+--+--+--+--+--+--+--+
| 7|13|  |31|  |55|  |  |83|
+--+--+--+--+--+--+--+--+--+

整个示例一目了然:

我在问题中给出了一个广泛的示例,演示了如何动态操作包含编码数据的SimpleXMLElement,将其转换为更易访问的数据

在您的例子中也可以这样做,不过这次我想展示一下如何使用自定义迭代器来实现这一点

但是首先让我们考虑表是如何表示的:表由行和列组成。所以我们可以迭代行,每一行都可以是列的迭代器

关于你的问题,还有另一个迭代器在表上。因此,在伪代码中,这可能看起来像:

foreach($tables as $table)
{
    foreach ($table as $rows) {
        foreach ($rows as $column) {
        }
    }
}
在这附近做输出。例如,如果我们有一个迭代器,它能够迭代行和列,从而将is转换为一个表(例如,到目前为止,作为演示目的的纯文本),那么伪代码可以简化为:

foreach($tables as $table)
{
    echo new TextTable($table);
}
如本例所示,问题已经减少到只显示一个表,因为所有表都遵循相同的结构。我现在不显示
TextTable
工作,不需要进一步关注。如果您正在寻找一个迭代器,该迭代器在相同的迭代之后输出一个HTML表,请参见上面的链接问题,它有一个
HtmlTableIterator
,它完成了大部分工作。但是现在,让我们看看如何在行和列上创建迭代器

为此,我将向您介绍一个名为的现有迭代器类。它可以用来装饰e