【问题标题】:Add attribute to child node XML using PHP使用 PHP 向子节点 XML 添加属性
【发布时间】:2018-09-16 18:27:33
【问题描述】:

我正在努力在具有静态唯一 ID 的 XML 文件中附加一个子节点。

我正在使用的 XML 提要托管在其他地方的服务器上,只能通过其 URL 访问。

所说的提要遵循这种模式:

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>

我想要实现的是使用提要中的 URL 将唯一 id 添加到“属性”节点并在备用 URL 处输出 XML 提要。

例如example.com/proeprty-feed 包含没有 ID 的提要。使用 PHP 添加 ID 并将提要输出到 something.com/property-feed

<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property upid=123456>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property upid=abcdef>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>

我试过的是input.php

<?php
$xmlstr = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>
XML;
?>

还有output.php

<?php

include 'input.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('upid', uniqid('prop-'));

echo $sxe->asXML();

?>

但是这个输出:

<properties upid="prop-5ac7c06a39ddd">
    <property>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>

【问题讨论】:

  • 请发布您目前拥有的代码并描述什么不起作用。
  • 唯一ID应该从哪里来?
  • 请阅读How to Ask

标签: php xml feed


【解决方案1】:

类似这样的事情:

<?php

$string = '<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>';
$xml = new SimpleXMLElement($string);

for($i = 0; $i < count($xml -> property); $i++) {
    $xml -> property[$i] -> addAttribute('upid', uniqid());
}
header('Content-Type: text/xml');
print $xml -> asXml();

【讨论】:

  • 甜蜜!谢谢您的帮助。如何将此应用于可通过第三方 URL g.g. 获得的 XML 提要。 example.com/property-feed 我曾考虑添加 more_entropy,但无法通过将 ID 添加到子节点。
  • 我不确定您的特定用例。你想对来自外部服务器的 XML 做什么?这是经常加载的,一次加载,等等...提供更多详细信息,我很乐意回复。
  • 基本上,我从第三方服务器获得了一个 XML 提要,我有权使用该提要。它包含大约 4,000 个属性。但是没有一个属性有任何 ID。我想使用我的服务器添加 ID,然后我可以使用 ID 从服务器导出 XML 提要。这种使用是允许的。如果有任何进一步的见解,我已经修改了我的问题。
  • 您可以获取文件,使用下面的代码更新 xml,然后将字符串保存到本地服务器上的文件中。请参阅 CURL 或 file_get_contents 以获取外部文件。请参阅 file_put_contents 或 fopen -> fwrite -> fclose。见:*.com/questions/26876446/…
  • 无需使用 cURL。选择了 simplexml_load_file 并将其与您的 sn-p 结合起来。 &lt;?php $xml=simplexml_load_file("https://example.com/properties"); for($i = 0; $i &lt; count($xml -&gt; property); $i++) { $xml -&gt; property[$i] -&gt; addAttribute('upid', uniqid('upid-')); } header('Content-Type: text/xml'); print $xml -&gt; asXml();
【解决方案2】:
<?php
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<properties>
    <property>
        <title>Some Sunny Place</title>
        <address>Some Building, Somewhere, Really Nice</address>
    </property>
    <property>
        <title>Some Rainy PLace Place</title>
        <address>Some Gutter, Somewhere, Not So Nice</address>
    </property>
</properties>';

$length = strlen('<property>');

while ($pos = strpos($xml, '<property>')) {
    $xml = substr_replace($xml, '<property upid=' . uniqid() . '>', $pos, $length);
    usleep(10); // Necessary so uniqid() is unique every iteration, it's kind of a hack not sure if it's the best solution
}

var_dump($xml);

【讨论】:

  • 我们是否将 XML 视为文本字符串?重新考虑使用 DOM 方法。
  • XML 是符合W3C standards 的结构化标记文件。它可以包含entity references、unicode 和可能难以使用或需要使用字符串函数转义的二进制数据。虽然这个例子看起来很简单,但 OP 省略了实际内容。
  • 我必须使用的 XML 提要包含 4,000 多个属性,每个属性都有自己的子级。恐怕我不遵循 DOM。我确实看过,但我对将 PHP 与 XML 结合使用是全新的。简而言之,上面的答案将 ID 添加到静态 XML 内容中,但我希望能够使用 URL 即时执行此操作。有人建议使用 cURL,但我不知道如何将 XML URL 转换为像上面的帖子那样的字符串。
最近更新 更多