【问题标题】:adding previous top level node inside a new top level node SimpleXML在新的顶级节点 SimpleXML 中添加上一个顶级节点
【发布时间】:2014-04-21 19:04:41
【问题描述】:

我有一个这样的 XML 文件:

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

虽然我知道如何按照 SimpleXML http://www.php.net/manual/en/simplexmlelement.addattribute.php 的 PHP 文档添加属性

我不确定是否可以将我拥有的内容包装在另一个标签中。我想将上面的示例更改为:

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

所以基本上我所做的是创建一个名为 main 的新顶级节点并放置一个新属性 cust 并添加一个值,然后在 cust 属性之后的主节点内添加上一个顶级节点导出。

理想情况下,我想使用 simpleXML,但我想知道最好的方法是什么,从导出中读取所有内容,然后在循环中将其全部吐出,这是最好的方法还是有办法只是说在这里打印所有的导出节点,而不是阅读整个 XML 并且必须循环并重新构建它只是为了添加 2 个新节点?

【问题讨论】:

    标签: php simplexml


    【解决方案1】:

    这不适用于 SimpleXML,但适用于 DOMDocument,它允许从一个文档递归地导入节点到另一个文档。幸运的是,SimpleXML 只是 PHP 中 DomDocument 之上的一个外观,节点可以从 SimpleXML 导入到 DOM,然后在 DOM 中从一个文档导入另一个文档:

    $xml = new SimpleXMLElement('<?xml version="1.0"?>
    <export>
      <config>
        <Exported Name="test">
          <values>
            <node name="yellow" />
            <node name="green" />
            <node name="red" />
          </values>
        </Exported>
      </config>
    </export>');
    
    $target = new SimpleXMLElement('<?xml version="1.0"?>
    <main>
       <cust>
           johndoe@gmail.com
       </cust>
    </main>');
    
    $cust = dom_import_simplexml($target->cust);
    
    $cust->parentNode->appendChild(
        $cust->ownerDocument->importNode(dom_import_simplexml($xml), true)
    );
    
    $target->asXML('php://output');
    

    输出:

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

    【讨论】:

      【解决方案2】:

      SimpleXML 似乎不允许这样的操作。 用简单的文本替换节点内容很容易;

      $xml->config->Exported->values = 'Nodes were here.';
      

      但如果我尝试使用这种方式放置 XML 或 SimpleXMLElement,我会失败。

      $xml->config->Exported->values = '<a>asd</a>';
      

      产生 «< a &gt ;asd &lt ;/a &gt ;»。 我还尝试调用 SimpleXMLElement 的构造函数来制作节点内容并将其插入另一个节点。

      $xml->config->Exported->values = new SimpleXMLElement…
      

      它只插入空格。因此,仅使用 SimpleXML 的解决方案是扫描 XML 并创建一个新的。

      在我看来,重组 XML 最有效的方法是 XSLT。

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 1970-01-01
        • 2014-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多