Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Xml模板生成类以构建XPath_C#_.net_Xml_Xpath_T4 - Fatal编程技术网

C# 从Xml模板生成类以构建XPath

C# 从Xml模板生成类以构建XPath,c#,.net,xml,xpath,t4,C#,.net,Xml,Xpath,T4,我想知道是否已经有一些东西可以从XML模板生成一些c类,从而能够使用xpath生成不那么脆弱的代码 而不是使用XPATH“/cat/noeud/key”从生成的类cat.noeud.key 我在asp.NETMVC中对控制器使用了类似的东西,很好奇是否有人对xml模板使用了类似的东西 [编辑] 我的问题中有T4标记,但我没有详细说明,目的是在每次重新编译后重新生成T4.tt,以便在xml模板中进行更改时,如果您希望从xml定义生成类,请查看名为xsd.exe()的工具 如果定义了表示Xml的Xm

我想知道是否已经有一些东西可以从XML模板生成一些c类,从而能够使用xpath生成不那么脆弱的代码

而不是使用XPATH
“/cat/noeud/key”
从生成的类
cat.noeud.key

我在asp.NETMVC中对控制器使用了类似的东西,很好奇是否有人对xml模板使用了类似的东西

[编辑]


我的问题中有T4标记,但我没有详细说明,目的是在每次重新编译后重新生成T4.tt,以便在xml模板中进行更改时,如果您希望从xml定义生成类,请查看名为xsd.exe()的工具

如果定义了表示Xml的Xml模式(.xsd文件),则可以使用xsd.exe生成与该Xml模式匹配的类


一个这样的类的实例在序列化(作为XML)时将导致该实例的XML表示。(符合生成类时使用的XML模式)

就像Geekiod提到的那样,我使用XSD。以下是我的T4设置:

我的T4解决方案中有MyObject.xml文件

要从MyObject.xml生成MyObject.cs(或在我更改MyObject.xml架构时更新),我运行以下bat脚本:

cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
xsd "C:\Users\XXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXX.Templates.CodeGenerator\MyObject.xml"
xsd "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.xsd" /c
xcopy /s "C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\MyObject.cs" "C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.Common"
这将在.xml文件上运行Microsoft SDK提供的XSD程序。XSD生成一个.XSD文件。在新的.XSD文件上再次运行XSD,它将创建.cs文件。都有相同的名字。然后脚本将.cs文件从SDK文件夹复制回我的项目中

现在您有了基于xml文档的.cs强类型文件。现在,您可以在.tt文件中执行以下很酷的操作:

<#@ parameter name="XmlFileName" type="System.String" #>
<#

    XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
    StreamReader sr = new StreamReader(this.XmlFileName);
    MyObject O = (MyObject)serializer.Deserialize(sr);

#>
using System;


public class <#= O.Name #> : BusinessObjectBase<<#= O.Name #>Data>
    {
        #region Construction

        private <#= O.Name #>() : base(true) {}

        /// <summary>
        /// Initializes a new instance of the <#= Utility.GetRefClassName(O.Name) #> class.
        /// </summary>
        /// <param name="data"></param>
        <#= Utility.GetRemarksComment2(O) #>
        internal <#= O.Name #>(<#= O.Name #>Data data) : base(data) {}

        #endregion

        #region <#= O.Name #> Data

        <#
        // Generate a property for each child.
        foreach (MyObjectProperty objProp in O.Property)
        {
            if (objProp.GetAccess == "public")
            {
                objProp.GetAccess = ""; 
            }
            else
            {
                objProp.GetAccess = objProp.GetAccess + " ";
            }

            if (objProp.SetAccess == "public")
            {
                objProp.SetAccess = ""; 
            }
            else
            {
                objProp.SetAccess = objProp.SetAccess + " ";
            }

        #>/// <summary>

使用制度;
公共类:BusinessObjectBase
{
#区域建设
private():基(真){}
/// 
///初始化类的新实例。
/// 
/// 
内部(数据):数据库(数据){}
#端区
#区域数据
/// 

要运行我的T4解决方案以生成.tt文件的代码,我将“XmlFileName”变量绑定到TextTemplatingSession类。这允许我指向我想要的任何MyObject.xml文件(MyOtherObject.xml、Customer.xml等):

static void RunThroughSession()
{
string objectName=“MyObject”;
var template=Activator.CreateInstance();
TextTemplatingSession会话=新建TextTemplatingSession();
会话[“XmlFileName”]=
@“C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXXX.Templates\XXXXXX.Templates.CodeGenerator\”+objectName+“.xml”;
template.Session=会话;
初始化();
string outputText=template.TransformText();
使用(StreamWriter sr=新StreamWriter)(
@“C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.CodeGenerator\GeneratedCode\BusinessObject”+objectName+“.cs”))
{
sr.Write(输出文本);
}
最后一点是,您需要将“自定义工具”选项从.tt文件属性更改为“TextTemplatingFilePreprocessor”。默认设置类似于“TextTemplatingGenerator”,它不适用于此设置

希望这有帮助

static void RunThroughSession()
        {
            string objectName = "MyObject";

            var template = Activator.CreateInstance<BusinessObjectTemplate>();
            TextTemplatingSession session = new TextTemplatingSession();
            session["XmlFileName"] =
                @"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXXX.Templates\XXXXXX.Templates.CodeGenerator\" + objectName + ".xml";

            template.Session = session;
            template.Initialize();
            string outputText = template.TransformText();
            using (StreamWriter sr = new StreamWriter(
                @"C:\Users\XXXXX\Documents\Visual Studio 2012\Projects\XXXXX.Templates\XXXXXX.Templates.CodeGenerator\GeneratedCode\BusinessObject" + objectName + ".cs"))
            {
                sr.Write(outputText);
            }