Замена XML-элемента - PullRequest
       0

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

1 голос
/ 02 ноября 2011

У меня есть 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>  

Я пытаюсь заменить Local [002], [Local003], [Local004] и [Local005] на Local [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]");
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Я пытаюсь заменить Local [002], [Local003], [Local004] и [Local005] на Local [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().

1 голос
/ 03 ноября 2011
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");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...