使用DOM和PHP将条目附加到XML文件

时间:2014-05-07 09:25:43

标签: php xml dom

我正在尝试使用DOM / PHP将条目添加到XML文件中,但是我无法让它出现在XML文件中。

XML架构如下:

<alist>
    <a>
          <1>text a</1>
          <2>text a</2>
    </a>
    <a>
          <1>text b</1>
          <2>text b</2>
    </a>
</alist>

和PHP是:

$xmlFile = "../../data/file.xml";
$dom = DOMDocument::load($xmlFile);
$v1 = "text c";
$v2 = "text c";

//create anchor
$alist = $dom->getElementsByTagName("alist");

//create elements and contents for <1> and <2>
$a1= $dom->createElement("1");
$a1->appendChild($dom->createTextNode($v1));
$a2= $dom->createElement("2");
$a2->appendChild($dom->createTextNode($v2));

//Create element <a>, add elements <1> and <2> to it.
$a= $dom->createElement("a");
$a->appendChild($v1);
$a->appendChild($v2);

//Add element <a> to <alist>
$alist->appendChild($a);

//Append entry?
$dom->save($xmlFile);

1 个答案:

答案 0 :(得分:1)

getElementsByTagName()返回具有该标记名称的元素节点列表。您无法将节点附加到列表中。您只能将它们附加到列表中的元素节点。

您需要检查列表是否包含节点并阅读第一个节点。

不允许使用12等数字元素名称。数字不能是xml限定名称的第一个字符。即使将它们编号为e1, e2, ...也是一个坏主意,它使定义变得困难。如果需要该号码,请将其放入属性值。

$xml = <<<XML
<alist>
    <a>
          <n1>text a</n1>
          <n2>text a</n2>
    </a>
    <a>
          <n1>text b</n1>
          <n2>text b</n2>
    </a>
</alist>
XML;

$dom = new DOMDocument();
$dom->preserveWhiteSpace = FALSE;
$dom->formatOutput = TRUE;
$dom->loadXml($xml);
$v1 = "text c";
$v2 = "text c";

// fetch the list
$list = $dom->getElementsByTagName("alist");
if ($list->length > 0) {
  $listNode = $list->item(0);

  //Create element <a>, add it to the list node.
  $a = $listNode->appendChild($dom->createElement("a"));

  $child = $a->appendChild($dom->createElement("n1"));
  $child->appendChild($dom->createTextNode($v1));

  $child = $a->appendChild($dom->createElement("n2"));
  $child->appendChild($dom->createTextNode($v2));

}

echo $dom->saveXml();

输出:https://eval.in/147562

<?xml version="1.0"?>
<alist>
  <a>
    <n1>text a</n1>
    <n2>text a</n2>
  </a>
  <a>
    <n1>text b</n1>
    <n2>text b</n2>
  </a>
  <a>
    <n1>text c</n1>
    <n2>text c</n2>
  </a>
</alist>