在网页上编辑 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()
。甚至将节点名称包装在 <label>
标签内,并带有对齐样式。更重要的是,使用 XSLT 函数添加唯一的<input>
id
(用于 CSS/javascript 识别)和name
(用于 php 识别):name()
和 position()
。为了更好地管理每个事件,请将脚本分成 event
和 events
模板
<?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
模板中的<xsl:apply-templates>
中运行括号内的[]
条件:
<!-- 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() > 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 -> XSL -> HTML 编辑文件,并在没有 asp 的情况下保存 xml 中的更改