AUTOSAR ARXML处理 - C#的解析代码(一)

1、目的

本文介绍通过AUTOSAR组织提供的xsd文件,自动生成对应的C#解析代码的框架。

自动生成方法:Microsoft SDKs\Windows\v7.0A\bin\xsd.exe

命令:xsd.exe AUTOSAR_4-0-3.xsd /c /l:CS /n:AUTOSAR4

AUTOSAR_4-0-3.xsd 是需要生成代码的xsd文件。

在C#环境下固定几个版本没有问题,其他AUTOSAR版本的xsd会在生成过程中产生循环组引用错误,不能生成代码。

2、适用版本

AUTOSAR版本XSD生成的C#库文件
4.0.3

【免费】AUTOSAR4.0.3的ARXML文件解析资源-优快云文库

4.2.2【免费】AUTOSAR4.2.2的ARXML文件解析资源-优快云文库
4.4.0【免费】AUTOSAR4.4.0的ARXML文件解析资源-优快云文库

3、解析库的使用方法

// XmlFilePath: ARXML 文件路径
public static AUTOSAR ReadXmlToClass(string XmlFilePath)
{
    XmlSerializer xs = new XmlSerializer(typeof(AUTOSAR));
    using (FileStream fs = new FileStream(XmlFilePath, FileMode.Open))
    {
         return (AUTOSAR)xs.Deserialize(fs);
    }
}

4、生成的代码

4.1 代码头

以下是生成的代码头部部分,我们后续需要用到这个命名空间和类。当然直接生成的代码还是需要做补充,修改等操作。后续篇章会陆续进行介绍。

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行库版本:2.0.50727.3082
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------

// 
// This source code was auto-generated by xsd, Version=2.0.50727.3038.
// 
namespace AUTOSAR4 
{
    using System.Xml.Serialization;
    using System.Collections.ObjectModel;
    using System;
    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://autosar.org/schema/r4.0")]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="http://autosar.org/schema/r4.0",IsNullable=false)]
    [System.Xml.Serialization.XmlSchemaProvider("http://autosar.org/schema/r4.0 AUTOSAR_4-0-3.xsd")]

    public partial class AUTOSAR {
    # 代码较大,此处省略.....
    }
}

4.3 ARXML框架

4.3.1 配置模版

<AUTOSAR>
    <AR-PACKAGES>
        <AR-PACKAGE>
            <ELEMENTS>
                <ECUC-MODULE-DEF>
                    <CONTAINERS>
                        <ECUC-PARAM-CONF-CONTAINER-DEF>
                            <PARAMETERS>
                                <参数类对应的标签>
                            <SUB-CONTAINERS>
                                <ECUC-PARAM-CONF-CONTAINER-DEF>
                                <ECUC-CHOICE-CONTAINER-DEF>
                                    <ECUC-PARAM-CONF-CONTAINER-DEF>

4.3.2 配置数据

<AUTOSAR>
    <AR-PACKAGES>
        <AR-PACKAGE>
            <ELEMENTS>
                <ECUC-MODULE-CONFIGURATION-VALUES>
                    <CONTAINERS>
                        <ECUC-CONTAINER-VALUE>
                            <PARAMETER-VALUES>
                                <参数值类对应的标签>
                            <SUB-CONTAINERS>
                                <ECUC-CONTAINER-VALUE>
  

4.2 配置模版关键类

AUTOSAR的ECU配置分成两个模型,即用来定义配置模版(M1)和配置数据(M0)。每个应用代码都是用配置数据来表示,配置数据里会引用到配置模版中。配置数据的解析在后续章节说明

如下图所示,这个配置数据是参考标准库的配置模版进行使用的。

        <ECUC-MODULE-CONFIGURATION-VALUES UUID="5327e39a-f8d9-423c-ba83-53c8806e66f9">
          <SHORT-NAME>CanIf</SHORT-NAME>
          <DEFINITION-REF DEST="ECUC-MODULE-DEF">/AUTOSAR/EcucDefs/CanIf</DEFINITION-REF>

4.2.1 配置模版:模块 MODULE (ECUCMODULEDEF,<ECUC-MODULE-DEF>)

该类用于处理模块,如CanIf, Com等。

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="ECUC-MODULE-DEF", Namespace="http://autosar.org/schema/r4.0")]
    public partial class ECUCMODULEDEF {
        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCCHOICECONTAINERDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCPARAMCONFCONTAINERDEF), IsNullable=false)]
        # 容器集合,保护多个配置集;可以是参数容器,也可以是选择容器
        public object[] CONTAINERS {
            get {
                return this.cONTAINERSField;
            }
            set {
                this.cONTAINERSField = value;
            }
        }
    }

4.2.2 配置模版:参数容器(ECUCPARAMCONFCONTAINERDEF,<ECUC-PARAM-CONF-CONTAINER-DEF>)

相当于配置的文件夹

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="ECUC-PARAM-CONF-CONTAINER-DEF", Namespace="http://autosar.org/schema/r4.0")]
    public partial class ECUCPARAMCONFCONTAINERDEF {

/// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCADDINFOPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCBOOLEANPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCENUMERATIONPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCFLOATPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCFUNCTIONNAMEDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCINTEGERPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCLINKERSYMBOLDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCMULTILINESTRINGPARAMDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCSTRINGPARAMDEF), IsNullable=false)]
        # 配置参数集合
        public object[] PARAMETERS {
            get {
                return this.pARAMETERSField;
            }
            set {
                this.pARAMETERSField = value;
            }
        }
        
        /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCCHOICEREFERENCEDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCFOREIGNREFERENCEDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCINSTANCEREFERENCEDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCREFERENCEDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCSYMBOLICNAMEREFERENCEDEF), IsNullable=false)]
        # 参考参数集合
        public object[] REFERENCES {
            get {
                return this.rEFERENCESField;
            }
            set {
                this.rEFERENCESField = value;
            }
        }

        /// <remarks/>
        [System.Xml.Serialization.XmlArrayAttribute("SUB-CONTAINERS")]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCCHOICECONTAINERDEF), IsNullable=false)]
        [System.Xml.Serialization.XmlArrayItemAttribute(typeof(ECUCPARAMCONFCONTAINERDEF), IsNullable=false)]
        # 子容器集合,可以是参数容器,也可以是选择容器
        public object[] SUBCONTAINERS {
            get {
                return this.sUBCONTAINERSField;
            }
            set {
                this.sUBCONTAINERSField = value;
            }
        }
    }

4.2.3 配置模版:选择容器(ECUCCHOICECONTAINERDEF, <ECUC-CHOICE-CONTAINER-DEF>)

可以选择不同类型的参数容器

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="ECUC-CHOICE-CONTAINER-DEF", Namespace="http://autosar.org/schema/r4.0")]
    public partial class ECUCCHOICECONTAINERDEF {

            /// <remarks/>
        [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)]
        # 可选的参数容器集合,AUTOSAR配置过程中只能在这个集合中选择一个
        public ECUCPARAMCONFCONTAINERDEF[] CHOICES {
            get {
                return this.cHOICESField;
            }
            set {
                this.cHOICESField = value;
            }
        }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值