我在这里查找了很多资料,但找不到解决我的问题的方法,并且在使用 RegEx 时遇到问题。
我正在尝试使用如下标签来更改 XML 文件:
<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>
<key>Date Added</key><date>2014-09-09T18:06:23Z</date>
对于类似这样的标签:
<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>
<key>Date Added</key><date>2014-09-??T18:06:23Z</date>
基本上将“添加日期”字段更改为 2014-09-?? 以匹配
<key>Date Modified</key><date>2014-09-09T16:18:44Z</date>
但是时间“T16:18:44z”总是不同的。只有日期是相同的。(即)
<key>Date Modified</key><date>2014-09-09..........</date>
答案1
正则表达式不是完成这项工作的最佳工具。请参阅关于该主题的著名长篇大论:https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
完成这项工作的正确工具是 XML 转换语言 XSLT。XSLT 2.0 可以使用正则表达式来操作单个节点的内容,但它使用适当的 XML 解析器来理解标记。以下是您可以为此任务包含在 XSLT 中的转换规则:
<xsl:template match="date
[preceding-sibling::key[1]='Date Added']
[preceding-sibling::key[2]='Date Modified']
[starts-with(preceding-sibling::date[1],'2014-09-09')]">
<date>
<xsl:value-of select="concat(substring(.,1, 8), '??', substring(, 11))"/>
</date>
</xsl:template>
(匹配模式如此复杂的原因是 XML 结构太差。没有连接键和日期的包装元素,也没有连接两个键元素的包装元素)。