我正在尝试使用PHP将HTML表单和额外文本保存到XML,但我遇到了问题。
我想将任何数据子设置为带有参数childNodes-> length的自动ID。
这没关系,但是当我尝试使用preserveWhiteSpace = false时,前两个数据具有相同的id = 1。
使用preserveWhiteSpace = false我有一个正确的id,但我的file.xml中没有一个很好的格式。
这里的代码: 1. Html / Php
<html>
<head>
</head>
<body>
<?php
if (isset($_REQUEST['ok'])) {
$dom = new DOMDocument("1.0","utf-8");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("a.xml");
$rootElement = $dom->getElementsByTagName("document")->item(0);
$total = $rootElement->childNodes->length;
$dataElement = $dom->createElement("data");
$dataElement->setAttribute("id", $total);
$dataElement->appendChild($dom->createElement("a",$_REQUEST['a']));
$dataElement->appendChild($dom->createElement("b",$_REQUEST['b']));
$dataElement->appendChild($dom->createElement("id", $total));
$rootElement->appendChild($dataElement);
$dom->save("a.xml");
}
?>
<form>
<input type="text" name="a" />
<input type="text" name="b" />
<button type="submit" name="ok" >update</button>
</form>
</body>
</html>
带有preserveWhiteSpace = false的xml代码;
<?xml version="1.0" encoding="utf-8"?>
<document>
<data id="1">
<a>dfg shhs</a>
<b>dhhdhd dhdhd</b>
<id>1</id>
</data>
<data id="1">
<a>dggd mdmmd</a>
<b>dhhd dndh</b>
<id>1</id>
</data>
<data id="2">
<a>dggd mdmmd</a>
<b>dhhd dndh</b>
<id>2</id>
</data>
</document>
带有preserveWhiteSpace = true;
的xml代码<?xml version="1.0" encoding="utf-8"?>
<document>
<data id="1"><a>dggd mdmmd</a><b>dhhd dndh</b><id>1</id></data><data id="2"><a>dggd mdmmd</a><b>dhhd dndh</b><id>2</id></data><data id="3"><a>dggd mdmmd</a><b>dhhd dndh</b><id>3</id></data></document>
我该怎么办?
答案 0 :(得分:0)
有一些事情我已经改变了,有些是更多的细节,有些是问题的原因。我在代码中添加了注释,而不是解释一些问题......
<html>
<head>
</head>
<body>
<?php
if (isset($_REQUEST['ok'])) {
$dom = new DOMDocument("1.0","utf-8");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load("a.xml");
// Fetch the document root element
$rootElement = $dom->documentElement;
// Set total to the number of <data> elements (add 1 for next)
$total = $dom->getElementsByTagName("data")->length + 1;
$dataElement = $dom->createElement("data");
$dataElement->setAttribute("id", $total);
$dataElement->appendChild($dom->createElement("a",$_REQUEST['a']));
$dataElement->appendChild($dom->createElement("b",$_REQUEST['b']));
$dataElement->appendChild($dom->createElement("id", $total));
$rootElement->appendChild($dataElement);
if ( $total == 1 ) {
$tmp = $dom->saveXML();
$dom->loadXML($tmp);
}
$dom->save("a.xml");
}
?>
<form>
<input type="text" name="a" />
<input type="text" name="b" />
<button type="submit" name="ok" >update</button>
</form>
</body>
</html>
您遇到的问题是您只是查看根元素的子元素数。由于DOM非常具体,即使您尝试保留的空白也被归类为元素。因此,这可能是一种非常误导性的尝试计算文档中项目的方法。这就是为什么我改变了它来计算<data>
元素的数量。
我做的最后一件事就是你可能会注意到,当你添加第一个项目并保存它时,格式不是你所期望的。这就是为什么在保存之前代码卸载并重新加载XML(我所在的地方if ( $total == 1 ) {
,这将迫使代码仅在第一次重新格式化XML。