在网页上编辑 XML 文件并使用 PHP 保存回 XML 文件

Posted

技术标签:

【中文标题】在网页上编辑 XML 文件并使用 PHP 保存回 XML 文件【英文标题】:Edit XML file on web page and save back to XML file using PHP 【发布时间】:2021-04-03 04:49:05 【问题描述】:

我有一个包含事件列表的 XML 文件,需要通过网页对其进行编辑,当提交编辑后的数据时,需要将其保存回 XML 文件。

我使用 XSL 文件在网页上显示 XML。对于每个节点,它会显示一个空输入框,右侧是节点值。如何让节点值出现在输入文本框中?以及如何让节点名称出现在输入文本框的左侧?

下一个问题是,一旦它被编辑了,我怎样才能将它以完全相同的结构存储在 XML 文件中?

还有一件事,我如何添加或删除事件?谢谢。

这是 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<events>
    <event>
        <id>ev01</id>
        <date>31/12/2020</date>
        <start-time>09:00</start-time>
        <end-time>12:00</end-time>
        <title>Event #1</title>
        <cost>20</cost>
        <venue>London</venue>
        <available-places>10</available-places>
        <updates><![CDATA[We'll post updates here]]></updates>
    </event>
    <event>
        <id>ev02</id>
        <date>31/12/2020</date>
        <start-time>13:00</start-time>
        <end-time>17:00</end-time>
        <title>Event #2</title>
        <cost>20</cost>
        <venue>London</venue>
        <available-places>Sold out</available-places>
        <updates><![CDATA[We'll post updates here]]></updates>
    </event>
</events>

这是 XSL 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/events">
  <div id="edit_xml">
  <h2>My events</h2>
  <form method="post" action="#edit_xml">
    <xsl:for-each select="event/*">
      <p>
      <input type="text" id="" name="" value="">
      <xsl:value-of select="." />
      </input>
      </p>
    </xsl:for-each>
    <p><input type="submit" name="submit_data" value="Submit"/></p>
  </form>
  </div>
</xsl:template>

</xsl:stylesheet>

【问题讨论】:

请参阅how to ask 并提供MCVE。 @ArSeN ,感谢您的指点,我希望我的问题现在能更好地提出。 【参考方案1】:

回答您的 XSLT 问题以呈现 html 表单:

如何让节点值出现在输入文本框中?我怎样才能让节点名称出现在输入文本框的左侧? ... 还有一件事,如何添加或删除事件?

考虑调整 XSLT 以使用 name() 并使用表达式赋值:text()。甚至将节点名称包装在 &lt;label&gt; 标签内,并带有对齐样式。更重要的是,使用 XSLT 函数添加唯一的&lt;input&gt;id(用于 CSS/javascript 识别)和name(用于 php 识别):name()position()。为了更好地管理每个事件,请将脚本分成 eventevents 模板

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:template match="/events">
        <div id="edit_xml">
          <h2>My events</h2>
             <form method="post" action="#edit_xml">
                 <xsl:apply-templates select="event"/>
                 <p><input type="submit" name="submit_data" value="Submit"/></p>
             </form>
        </div>
    </xsl:template>
    
    <xsl:template match="event">
        <xsl:for-each select="*">
          <p>
              <label style="display: inline-block;width: 140px;">
                  <xsl:value-of select="name()"/>
              </label>
              <input type="text" id="concat(name(), position())" 
                     name="concat(name(), position())" 
                     value="text()"/>
          </p>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Online Demo

要删除元素,请在顶层events 模板中的&lt;xsl:apply-templates&gt; 中运行括号内的[] 条件:

<!-- SELECT ONLY FIRST event TO BE APPLIED -->
<xsl:apply-templates select="event[1]"/>

<!-- SELECT ONLY SECOND event TO BE APPLIED -->
<xsl:apply-templates select="event[2]"/>

<!-- SELECT ALL NODES AFTER FIRST event -->
<xsl:apply-templates select="event[position() &gt; 1]"/>

<!-- SELECT ALL NODES BUT EXCLUDE SECOND NODE -->
<xsl:apply-templates select="event[position() != 2]"/>

<!-- SELECT ONLY LAST event TO BE APPLIED -->
<xsl:apply-templates select="event[last()]"/>

对于这个非 XSLT 问题:

下一个问题是,一旦它被编辑了,我怎样才能将它以完全相同的结构存储在 XML 文件中?

您需要像在 PHP 中一样使用应用层处理表单提交,以接收输入值并绑定到 XML 文档中。事实上,您可以设置另一个具有精确原始布局的 XSLT 解决方案来接收来自 PHP 的参数!

【讨论】:

圣诞快乐,感谢您的回答。我想了解您所说的“设置另一个具有精确原始布局的 XSLT 解决方案以接收来自 PHP 的参数。您能在这里解释还是我应该问一个新问题? 同样!乐意效劳。 XSLT 不是为处理表单数据的服务器端处理而设计的。所以这是一个不同的问题。在询问之前,请研究并认真尝试。阅读 1) 如何处理用户提交的 HTML 表单和 2) 如何使用 PHP 变量编辑或重建 XML 文件。 好的,我会研究这些主题。谢谢你的建议。

以上是关于在网页上编辑 XML 文件并使用 PHP 保存回 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

xml文件用啥编辑

XML -> XSL -> HTML 编辑文件,并在没有 asp 的情况下保存 xml 中的更改

setAttribute 不保存回 XML 页面

打开远程文档并保存回远程服务器

PHP Soap - 使用 nusoap 保存 xml 服务器端

从/向 XML 文件编辑文本:它可以在本地主机上工作,但不能在互联网上工作? (php, xml)