simpleXML如何向现有XML添加新属性

时间:2014-04-21 12:09:32

标签: php simplexml

嘿,我希望制作现有XML的副本并在其顶部添加新属性

我当前的xml类似于:

<?xml version="1.0"?>
<export>
  <config>
    <Exported Name="test">
      <values>
        <node name="yellow" />
        <node name="green" />
        <node name="red" />
      </values>
  </config>
</export>

我只是想添加一个电子邮件字段,我正在使其符合规格,所以我无法控制更改布局,所以我无法做到例如

 <email value="myemail@gmail.com"></email>

所以我坚持让它显示如下

<?xml version="1.0"?>
<email>
  myemail@gmail.com
</email>
<export>
  <config>
    <Exported Name="test">
      <values>
        <node name="yellow" />
        <node name="green" />
        <node name="red" />
      </values>
  </config>
</export>

我尝试了很多东西,但我正在努力。我不知道如何在电子邮件节点中添加电子邮件的价值,我找到的所有示例似乎都告诉你如何添加一个属性然后在其中的一个孩子,但我找不到一个例子来添加一个电子邮件节点内的值。

我尝试的第一步就是让它添加属性电子邮件,这样我至少可以使该部分工作,但我也失败了。当然,我的最终目标是将电子邮件发送到节点电子邮件中,但我只是将其作为我尝试和失败的示例。我正在使用php文档示例但我显然做错了导致我收到错误:字符串无法解析为XML

$xml_file = "testing.xml";
$xml_path = XML_PATH.$xml_file;

$add_email = new SimpleXMLElement($xml_path);
$add_email->addAttribute('address', 'myemail@gmail.com');
$email = $add_email->addChild('email');

echo '<PRE>';
print_r($add_email);
echo '</PRE>';

但是,如果我执行以下操作,我可以看到xml回显正常,因此路径等很好,它是如何构建代码的问题所在。关于我搞砸的地方的任何提示?

$xml_file = "testing.xml";
$xml_path = XML_PATH.$xml_file;

$xml = simplexml_load_file($xml_path);
echo '<PRE>';
print_r($add_email);
echo '</PRE>';

以上输出xml罚款。

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,您正在尝试创建无效的XML,因此SimpleXML扩展在这里几乎没用。您需要使用正常的字符串操作。这是一个脆弱的(因为它匹配?>)实现:

<?php
$xml_file = "testing.xml";
$xml_path = XML_PATH . $xml_file;

$contents = file_get_contents($xml_path);
$contents = str_replace("?>", "?>\n<email>myemail@gmail.com</email>", $contents);

print_r($contents);
?>

请记住,尝试将生成的XML传递给任何需要有效XML的XML都会失败。

真正的问题仍然存在:为什么你会在一开始就故意想要生成无效的XML?

修改:要回答以下评论:

  

有人能解释一下这里发生了什么吗?&gt;就是这样   在每行开头的XML文件中隐藏文本?

不,它没有隐藏,?>就在这里:

<?xml version="1.0"?>
                   ^^
<export>
  ....
</export>

我添加的PHP代码将?>替换为?>新行(\n)和您想要的XML节点。

相关问题