Замена элемента XML

#c# #xml #xslt

#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>  
  

Я пытаюсь заменить локальные [002], [Local003], [Local004] и [Local005] на локальные [001] в C # с использованием XSLT. Я новичок в этом.
После замены 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]");
        }
    }
}
  

Комментарии:

1. Итак, где вы застряли? C #, XSLT, …?

2. Замена его с помощью C #. Я использую .NET Framework 2.0.

3. если (xpath. Содержит(«//Address»)) { const string LOCAL = «//Address/XPath»; if (!dr.IsNull(«document»)) { XmlNodeList localNodes = xDoc. Выберите узлы (ЛОКАЛЬНЫЕ); если (localNodes != null) { xpath = xpath.Replace( @»Local[d{3}]», «Local[001]»); } } }

Ответ №1:

Я пытаюсь заменить локальные [002], [Local003], [Local004] и [Local005] на локальные [001] в C # с использованием XSLT.

Если вы хотите использовать 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>
  

Как инициировать преобразование XSLT в .NET, описано в соответствующей документации MSDN ( XslCompiledTransform.Transform() )

Объяснение: переопределение правила идентификации. Использование стандартных функций XPath contains() translate() и concat() .

Ответ №2:

 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");
    }
}