使用php childNodes->长度错误将html表单保存到xml

时间:2017-12-16 19:39:41

标签: php html xml

我正在尝试使用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>

我该怎么办?

1 个答案:

答案 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。