首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#如何转换XML样式

C#如何转换XML样式
EN

Stack Overflow用户
提问于 2021-12-14 16:51:35
回答 1查看 35关注 0票数 -1

嗨,朋友们,我需要这个问题,我的xml风格

代码语言:javascript
复制
<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>

如何转换此样式

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-14 17:12:29

通过使用XSLT。

输入XML

代码语言:javascript
复制
<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

代码语言:javascript
复制
<?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>

输出

代码语言:javascript
复制
<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转换

代码语言:javascript
复制
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);
   }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70352604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档