加载 XML-File -> 添加项目 -> 重新排序 -> 写入 XML-File [PHP & SimpleXML]
Load XML-File -> Add items -> Reorder -> Write XML-File [PHP & SimpleXML]
摘要
- 加载现有的 XML-File
- 每个 child
添加 2 个项目
- 更改children
的顺序
- 写新的XML-File
详细说明
这是 Source-XML-File
的缩减示例
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
<marker>green</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
<marker>brown</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
<marker>marron</marker>
</markers>
(...)
</inventory>
</warehouse>
1.加载现有 XML-File
将 XML-File 加载到变量中。
$source_xmlfile = "source.xml";
$source_xml_file_contents = simplexml_load_file($source_xmlfile);
2。每个 child
添加 2 项
将 2 children 添加到具有名称和价值的第一个库存中。
$source_xml_file_contents->warehouse->inventory[0]->addChild("new1", "0.12345");
$source_xml_file_contents->warehouse->inventory[0]->addChild("new2", "17");
3。更改children
的顺序
无论我怎样尝试,这部分都不适合我。
我的想法如下:
$destination_xml_file_contents = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><warehouse></warehouse>');
foreach($source_xml_file_contents->warehouse->inventory as $inventory){
$destination_xml_file_contents->warehouse->addChild("inventory", $inventory);
}
基本的想法是,我从 中取出一个 child () 并存储在一个变量或一个数组中(这会更好更容易)包含所有东西包含(包括属性和child节点等)。
在我将所有 存储在其他地方之后,我使用一个新的 XML 并将存储的 以新的顺序放入新的 XML.
然而,似乎不可能将整个 child 保存到一个变量(或数组)中,然后再将其添加到另一个 XML。
由于顺序不一定是有序的,简单的排序对我没有帮助,而且由于我无法进行排序工作,所以我在这里不知所措。
4.写入新的XML-File
将新的 XML 内容保存到新的 XML-File。
$new_xml_file = "destination.xml";
$destination_xml_file_contents->asXML($new_xml_file);
这是目的地的缩短示例-XML-File
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
</marker>brown</marker>
</markers>
(...)
<new1>0.6789</new1>
<new2>115</new2>
</inventory>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
</marker>green</marker>
</markers>
(...)
<new1>0.4567</new1>
<new2>4</new2>
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
</marker>marron</marker>
</markers>
(...)
<new1>0.1234</new1>
<new2>17</new2>
</inventory>
</warehouse>
谁能帮我弄清楚如何进行这项工作?
现在我正在求助于解析整个 XML-File 并用字符串逐行重写它,因为 SimpleXML 似乎不起作用。
有几件事我不确定,但希望这段代码能够展示使用 DOMDocument 将节点从一个文档复制到另一个文档(并添加内容)的原理。我已经在代码中添加了注释以提供帮助,如果您有任何不确定的地方,请告诉我。
$inFile = "data.xml";
$input = new DOMDocument();
$input->load($inFile);
$all_inventory = $input->getElementsByTagName("inventory");
// Add new content to each item
foreach ( $all_inventory as $inventory ) {
$inventory->appendChild ( $input->createElement("new1", "0.12345"));
$inventory->appendChild ( $input->createElement("new2", "17"));
}
$outFile = "out.xml";
$output = new DOMDocument();
// Create base document for destination
$output->loadXML('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><warehouse />');
// Get the root element as we will be adding content to this
$outputRoot = $output->documentElement;
foreach ( $all_inventory as $inventory ) {
// Copy the element from the input document to the output document
// Note this does not add it anywhere, just makes it available
// The true option says make a deep copy
$import = $output->importNode($inventory, true);
// Add the newly imported node to the output document root
$outputRoot->appendChild($import);
}
$output->save($outFile);
输出几乎只是带有额外数据的输入文档的副本。您可以在第二个 foreach()
循环中添加一些逻辑来以某种其他格式对输出元素进行排序,我不确定那是什么。
另请注意,您的文档中存在一个小 XML 缺陷...
</marker>green</marker>
摘要
- 加载现有的 XML-File
- 每个 child 添加 2 个项目
- 更改children 的顺序
- 写新的XML-File
详细说明
这是 Source-XML-File
的缩减示例<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
<marker>green</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
<marker>brown</marker>
</markers>
(...)
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
<marker>marron</marker>
</markers>
(...)
</inventory>
</warehouse>
1.加载现有 XML-File
将 XML-File 加载到变量中。
$source_xmlfile = "source.xml";
$source_xml_file_contents = simplexml_load_file($source_xmlfile);
2。每个 child
添加 2 项将 2 children 添加到具有名称和价值的第一个库存中。
$source_xml_file_contents->warehouse->inventory[0]->addChild("new1", "0.12345");
$source_xml_file_contents->warehouse->inventory[0]->addChild("new2", "17");
3。更改children
的顺序无论我怎样尝试,这部分都不适合我。
我的想法如下:
$destination_xml_file_contents = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><warehouse></warehouse>');
foreach($source_xml_file_contents->warehouse->inventory as $inventory){
$destination_xml_file_contents->warehouse->addChild("inventory", $inventory);
}
基本的想法是,我从
然而,似乎不可能将整个 child 保存到一个变量(或数组)中,然后再将其添加到另一个 XML。
由于顺序不一定是有序的,简单的排序对我没有帮助,而且由于我无法进行排序工作,所以我在这里不知所措。
4.写入新的XML-File
将新的 XML 内容保存到新的 XML-File。
$new_xml_file = "destination.xml";
$destination_xml_file_contents->asXML($new_xml_file);
这是目的地的缩短示例-XML-File
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<warehouse>
<inventory>
<name>Name 2</name>
<markers>
<marker>blue</marker>
<marker>pink</marker>
</marker>brown</marker>
</markers>
(...)
<new1>0.6789</new1>
<new2>115</new2>
</inventory>
<inventory>
<name>Name 1</name>
<markers>
<marker>red</marker>
<marker>yellow</marker>
</marker>green</marker>
</markers>
(...)
<new1>0.4567</new1>
<new2>4</new2>
</inventory>
<inventory>
<name>Name 3</name>
<markers>
<marker>black</marker>
<marker>white</marker>
</marker>marron</marker>
</markers>
(...)
<new1>0.1234</new1>
<new2>17</new2>
</inventory>
</warehouse>
谁能帮我弄清楚如何进行这项工作?
现在我正在求助于解析整个 XML-File 并用字符串逐行重写它,因为 SimpleXML 似乎不起作用。
有几件事我不确定,但希望这段代码能够展示使用 DOMDocument 将节点从一个文档复制到另一个文档(并添加内容)的原理。我已经在代码中添加了注释以提供帮助,如果您有任何不确定的地方,请告诉我。
$inFile = "data.xml";
$input = new DOMDocument();
$input->load($inFile);
$all_inventory = $input->getElementsByTagName("inventory");
// Add new content to each item
foreach ( $all_inventory as $inventory ) {
$inventory->appendChild ( $input->createElement("new1", "0.12345"));
$inventory->appendChild ( $input->createElement("new2", "17"));
}
$outFile = "out.xml";
$output = new DOMDocument();
// Create base document for destination
$output->loadXML('<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?><warehouse />');
// Get the root element as we will be adding content to this
$outputRoot = $output->documentElement;
foreach ( $all_inventory as $inventory ) {
// Copy the element from the input document to the output document
// Note this does not add it anywhere, just makes it available
// The true option says make a deep copy
$import = $output->importNode($inventory, true);
// Add the newly imported node to the output document root
$outputRoot->appendChild($import);
}
$output->save($outFile);
输出几乎只是带有额外数据的输入文档的副本。您可以在第二个 foreach()
循环中添加一些逻辑来以某种其他格式对输出元素进行排序,我不确定那是什么。
另请注意,您的文档中存在一个小 XML 缺陷...
</marker>green</marker>