【问题标题】:C# Howto Convert XML Style [closed]C# 如何转换 XML 样式
【发布时间】:2022-01-17 23:38:08
【问题描述】:

嗨朋友我需要这个问题我的 xml 样式

<stringtable>
      <section>
        <string _enum="0x78B5CB94" _extra="0xFFFFFFFF" _id="856571" _value="Anladin.[Timing 0.43 0.00 1]" />
        <string _enum="0xA980AB0A" _extra="0xFFFFFFFF" _id="856572" _value="De nada.[Timing 0.37 0.00 1]" />

        <_name>0x25C84B25</_name>
      </section>
      <_language>english</_language>
    </stringtable>

如何转换这种风格

<stringtable language='english'>
  <section name='0x25C84B25'>
    <string enum='0x78B5CB94' extra='0xFFFFFFFF' id='856571' value='Anladın.[Timing 0.43 0.00 1]'></string>
    <string enum='0xA980AB0A' extra='0xFFFFFFFF' id='856572' value='De nada.[Timing 0.37 0.00 1]'></string>
</stringtable>
  </section>

【问题讨论】:

标签: c# xml


【解决方案1】:

通过使用 XSLT。

输入 XML

<stringtable>
    <section>
        <string _enum="0x78B5CB94" _extra="0xFFFFFFFF" _id="856571" _value="Anladin.[Timing 0.43 0.00 1]"/>
        <string _enum="0xA980AB0A" _extra="0xFFFFFFFF" _id="856572" _value="De nada.[Timing 0.37 0.00 1]"/>

        <_name>0x25C84B25</_name>
    </section>
    <_language>english</_language>
</stringtable>

XSLT

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

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

    <xsl:template match="stringtable">
        <xsl:copy>
            <xsl:attribute name="language">
                <xsl:value-of select="_language"/>
            </xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="section">
        <xsl:copy>
            <xsl:attribute name="name">
                <xsl:value-of select="_name"/>
            </xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="_name" />
    <xsl:template match="_language" />
</xsl:stylesheet>

输出

<stringtable language="english">
  <section name="0x25C84B25">
    <string _enum="0x78B5CB94" _extra="0xFFFFFFFF" _id="856571" _value="Anladin.[Timing 0.43 0.00 1]" />
    <string _enum="0xA980AB0A" _extra="0xFFFFFFFF" _id="856572" _value="De nada.[Timing 0.37 0.00 1]" />
  </section>
</stringtable>

c# XSLT 转换

void Main()
{
   const string SOURCEXMLFILE = @"e:\Temp\input.xml";
   const string XSLTFILE = @"e:\Temp\Process.xslt";
   const string OUTPUTXMLFILE = @"e:\temp\output.xml";

   try
   {
      XsltArgumentList xslArg = new XsltArgumentList();

      using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
      {
         XslCompiledTransform xslt = new XslCompiledTransform();
         xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());

         XmlWriterSettings settings = xslt.OutputSettings.Clone();
         settings.IndentChars = "\t";
         // to remove BOM
         settings.Encoding = new UTF8Encoding(false);

         using (XmlWriter result = XmlWriter.Create(OUTPUTXMLFILE, settings))
         {
            xslt.Transform(src, xslArg, result, new XmlUrlResolver());
            result.Close();
         }
      }
      Console.WriteLine("File '{0}' has been generated.", OUTPUTXMLFILE);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
}

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2011-10-30
    • 2016-12-11
    • 1970-01-01
    • 2011-06-25
    • 2015-07-25
    • 2018-08-10
    • 2013-09-06
    • 2015-08-04
    相关资源
    最近更新 更多