从XML生成C#代码:如何输出“<”和“>”
本文关键字:输出 生成 XML 代码 何输出 | 更新日期: 2023-09-27 18:36:52
我有一个从XML创建C#类的XSLT。我正在使用
<xsl:output method="text"/>
以创建文本文件。基本上,我从 http://docstore.mik.ua/orelly/xml/jxslt/ch08_05.htm 中获取代码并将其修改为输出 C# 代码。
但是现在我需要输出类似的东西
class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(obj => obj.LastName).NotEmpty();
...
}
}
。但是无论我想输出"<"或">",我都会得到"<"和">"。
有没有简单的方法可以做到这一点?
编辑:
这是我当前的 XSLT(CDATA 不起作用!
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="className" select="/Class/@Name"/>
<xsl:variable name="entityId" select="(//Property)[1]/@Name"/>
<xsl:template match="/Class">using System;
using System.Linq;
using Core.Common.Core;
using FluentValidation;
using System.Collections.Generic;
namespace PersonDosimetry.Client.Entities.Constants
{
public class <xsl:value-of select="$className"/>
<xsl:text> : ObjectBase</xsl:text>
{
<xsl:apply-templates select="Property" mode="generateField"/>
<xsl:text>
#region Business-mapped Properties
</xsl:text>
<xsl:apply-templates select="Property" mode="generateProperty"/>
#endregion
#region Validation
class <xsl:value-of select="$className"/>Validator : AbstractValidator<![CDATA[<]]><xsl:value-of select="$className"/><![CDATA[>]]>
{
public <xsl:value-of select="$className"/>Validator()
{
//RuleFor(obj =<![CDATA[>]]> obj.LastName).NotEmpty();
}
}
protected override IValidator GetValidator()
{
return new <xsl:value-of select="$className"/>Validator();
}
#endregion
}
}
</xsl:template>
<!--
*****************************************************************
** Generate a private field declaration.
**************************************************************-->
<xsl:template match="Property" mode="generateField"><xsl:text> </xsl:text>
<xsl:value-of select="@Type"/>
<xsl:text> _</xsl:text>
<xsl:value-of select="@Name"/>;
</xsl:template>
<!--
*****************************************************************
** Generate a "get" method for a property.
**************************************************************-->
<xsl:template match="Property" mode="generateProperty">
public <xsl:value-of select="@Type"/><xsl:text> </xsl:text><xsl:value-of select="@Name"/>
{
get { return _<xsl:value-of select="@Name"/>; }
set
{
if (_<xsl:value-of select="@Name"/> != value)
{
_<xsl:value-of select="@Name"/> = value;
OnPropertyChanged();
}
}
}
</xsl:template>
</xsl:stylesheet>
我的示例 XML:
<?xml version="1.0"?>
<Class Name="Person">
<Property Name="PersonId" Type="Int32" />
<Property Name="FirstNames" Type="String" />
<Property Name="LastName" Type="String" />
<Property Name="GenderTypeId" Type="Int32" />
<Property Name="BirthDate" Type="DateTime" />
<Property Name="InsuranceNumber" Type="String" />
<Property Name="Country" Type="String" />
<Property Name="Beruf" Type="String" />
</Class>
问题是我使用的XSLT处理器(这里的版本:http://www.codeproject.com/Articles/8823/A-better-MSXSL-EXE-Adding-the-ability-to-Transform)。我开始使用它,因为我的代码生成器需要处理几个文件,而且我的印象是这与 MSXSL 没有什么不同。
我下载了 MSXSL,使用 CDATA 一切顺利。
(后续问题是:如何在 .NET 中以编程方式执行正确的转换?或者是否有更好的 XSL 转换库可以使用?
更新
JLRishe 的评论将我引向正确的方向。我将上面提到的代码项目代码更改为以下内容,现在代码生成工作:
class Program
{
static void Main(string[] args)
{
if (args.Length != 3)
{
Console.WriteLine("You have not entered the correct parameters");
return;
}
string xmlfile = args[0];
string xslfile = args[1];
string outfile = args[2];
try
{
XPathDocument doc = new XPathDocument(xmlfile);
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load(xslfile);
XmlWriter writer = XmlWriter.Create(outfile, transform.OutputSettings);
transform.Transform(doc, writer);
writer.Close();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}
}
您应该研究 Xml 序列化。可以将对象转换为 xml 并转换回 c# 对象。这使我可以轻松地将任何对象存储为 xml,并快速将其反序列化回对象。
例如,我的对象称为"MyObject":
public object DeserializeXmlMyObj(String xml)
{
try
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
MyObject obj = null;
using (StringReader reader = new StringReader(xml))
{
obj = (MyObject)serializer.Deserialize(reader);
}
return obj ;
}
catch (Exception ex)
{
return null;
}
}