使用php childNodes-> length error将html表单保存到xml

问题描述 投票:0回答:1

我试图用PHP保存HTML表单和额外的文本到XML,但我有一个问题。

我想将任何数据子设置为带有参数childNodes-> length的auto-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>

我能做什么?

php html xml
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.