如何删除XML文件中的重复值并保留最后一个?

2024-04-27 17:10:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要抑制XML文件中的所有重复值,并保留最终值(参考目标文件)。在

请帮忙,因为我不知道是否应该使用xslt、python或任何.NETAPI

以下是源文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
    <artist>Bob Dylan</artist>
</cd>
<cd>
    <title>Hide your heart</title>
</cd>
<cd>
    <title>old_value</title>
    <title>inbetween_value</title>
    <title>new_value</title>
</cd>
</catalog>

预期的目标文件:

^{pr2}$

Tags: 文件目标titleartistvalueversioncdiso
3条回答

有一个非常简单(没有显式条件、没有轴)的XSLT解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output encoding="ISO-8859-1"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="cd/title[not(position() = last())]"/>
</xsl:stylesheet>

将此转换应用于所提供的XML文档时

^{pr2}$

产生想要的正确结果

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
   <cd>
      <artist>Bob Dylan</artist>
   </cd>
   <cd>
      <title>Hide your heart</title>
   </cd>
   <cd>
      <title>new_value</title>
   </cd>
</catalog>

XSLT 1版本:

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="*">
 <xsl:copy>
  <xsl:copy-of select="@*"/>
  <xsl:apply-templates/>
 </xsl:copy>
</xsl:template>
<xsl:template match="cd/*">
 <xsl:if test="not(following-sibling::*[name()=name(current())])">
  <xsl:copy-of select="."/>
 </xsl:if>
</xsl:template>
</xsl:stylesheet>

你可以使用任何你想要的技术。如果您的要求是“对于每个cd元素,只保留重复子元素名称的最后一个值”,这里是一个linqtoxml解决方案,假设您有一个名为oldDoc的{}:

var scrubbedDoc = new XDocument(new XElement("catalog",
    from cd in oldDoc.Element("catalog").Elements("cd")
    select new XElement("cd",
        from elementsGroupedByName in cd.Elements().ToLookup(e => e.Name)
        select elementsGroupedByName.Last())));

相关问题 更多 >