替换XML元素

时间:2011-11-02 17:10:39

标签: c# xml xslt

我有一个像这样的XML文件:

<Adresses>      
    <Address1>       
        <XPath>//Address/Local[001]/AddressLine1</XPath>       
        <Key>1</Key>     
    </Address1>     
    <Address2>       
        <XPath>//Address/Local[002]/AddressLineA</XPath>       
        <Key>2</Key>     
    </Address2>     
    <Address3>       
        <XPath>//Address/Local[003]/AddressLineBC</XPath>       
        <Key>3</Key>     
    </Address3>     
    <Address4>       
        <XPath>//Address/Local[004]/AddressLineA1</XPath>      
        <Key>4</Key>     
    </Address4>     
    <Address5>      
        <XPath>//Address/Local[005]/AddressLineCD1</XPath>       
        <Key>5</Key>     
    </Address5> 
</Adresses>  

我正在尝试使用XSLT在C#中用Local [001]替换Local [002],[Local003],[Local004]和[Local005]。我是新来的。 替换后,XML应如下所示:

<Adresses>      
    <Address1>       
        <XPath>//Address/Local[001]/AddressLine1</XPath>       
        <Key>1</Key>     
    </Address1>     
    <Address2>       
        <XPath>//Address/Local[001]/AddressLineA</XPath>       
        <Key>2</Key>     
    </Address2>     
    <Address3>       
       <XPath>//Address/Local[001]/AddressLineBC</XPath>       
       <Key>3</Key>     
    </Address3>     
    <Address4>       
        <XPath>//Address/Local[001]/AddressLineA1</XPath>      
        <Key>4</Key>     
    </Address4>     
    <Address5>      
        <XPath>//Address/Local[001]/AddressLineCD1</XPath>       
        <Key>5</Key>     
    </Address5> 
</Adresses>  

尝试了这个:

if (xpath.Contains("//Address"))
{
    const string LOCAL = "//Address/XPath";

    if (!dr.IsNull("document"))
    {
        XmlNodeList localNodes = xDoc.SelectNodes(LOCAL);

        if (localNodes != null)
        {
            xpath = xpath.Replace( @"Local[\d{3}]", "Local[001]");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

  

我正在尝试替换Local [002],[Local003],[Local004]和   [Local005]使用XSLT在C#中使用Local [001]。

如果您想使用XSLT,这是一个完整的XSLT转换

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match=
 "XPath/text()
      [contains(translate(.,'23456789','00000000'),
               '/Local[000]'
               )
      ]">
  <xsl:value-of select=
  "concat(substring-before(., '['),
          '[001]',
          substring-after(., ']')
          )
          "/>
 </xsl:template>
</xsl:stylesheet>

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

<Adresses>
    <Address1>
        <XPath>//Address/Local[001]/AddressLine1</XPath>
        <Key>1</Key>
    </Address1>
    <Address2>
        <XPath>//Address/Local[002]/AddressLineA</XPath>
        <Key>2</Key>
    </Address2>
    <Address3>
        <XPath>//Address/Local[003]/AddressLineBC</XPath>
        <Key>3</Key>
    </Address3>
    <Address4>
        <XPath>//Address/Local[004]/AddressLineA1</XPath>
        <Key>4</Key>
    </Address4>
    <Address5>
        <XPath>//Address/Local[005]/AddressLineCD1</XPath>
        <Key>5</Key>
    </Address5>
</Adresses>

产生了想要的正确结果

<Adresses>
   <Address1>
      <XPath>//Address/Local[001]/AddressLine1</XPath>
      <Key>1</Key>
   </Address1>
   <Address2>
      <XPath>//Address/Local[001]/AddressLineA</XPath>
      <Key>2</Key>
   </Address2>
   <Address3>
      <XPath>//Address/Local[001]/AddressLineBC</XPath>
      <Key>3</Key>
   </Address3>
   <Address4>
      <XPath>//Address/Local[001]/AddressLineA1</XPath>
      <Key>4</Key>
   </Address4>
   <Address5>
      <XPath>//Address/Local[001]/AddressLineCD1</XPath>
      <Key>5</Key>
   </Address5>
</Adresses>

如何在.NET中启动XSLT转换,请参阅相应的MSDN文档(XslCompiledTransform.Transform()

解释:覆盖identity rule。使用标准XPath函数 contains() translate() concat()

答案 1 :(得分:1)

using System;
using System.Xml;
using System.Text.RegularExpressions;

class Sample {
    static void Main(string[] args) {
        var doc = new XmlDocument();
        doc.Load(@"data.xml");
        XmlNodeList  nodes = doc.SelectNodes("/Adresses/*/XPath");
        Regex regex = new Regex(@"Local\[\d{3}\]");
        foreach(XmlNode  node in nodes){
            node.InnerText = regex.Replace(node.InnerText, "Local[001]");
        }
        doc.Save(@"data.xml");
    }
}