zoukankan      html  css  js  c++  java
  • XML节点自动生成简单实例

    有些时候我们在拼装XML的过程中,因为各种拼接会感到非常的麻烦(定义变量模型,自动生成,使用XElement再去组装),我的脑袋感觉都大了,能不能有个稍微比较快捷自动随变量自动生成XML格式的方式,看了网上大牛们的方式,还是老传统,不过代码很健壮耐用,我闲着没事也自己尝试能不能尽量在简化。

    1:解析XML

    解析的方式方法很多,但是我比较喜欢简单模式,通过系统缓存流进行读写操作(例如以下解析后存放到数据集Dataset中)

    //系统内存提供流式的读写操作
    var memoryStreams = new MemoryStream();

    具体看以下方法(将数据带出后直接存到Dataset中)

    //测试用例解析XML公共方法存放至Datatset数据集
        public DataSet StringXml(string TestXml)
        {
            //系统内存提供流式的读写操作
            var memoryStreams = new MemoryStream();
            //注意格式化字符集
            var buffer = Encoding.UTF8.GetBytes(TestXml);
            memoryStreams.Write(buffer, 0, buffer.Length);
            //设置讲readXml从0开始,不然错误提示XML缺少根元素
            memoryStreams.Position = 0;
            memoryStreams.Seek(0, SeekOrigin.Begin);
            DataSet dsXml = new DataSet();
            //将解析出来数组数据放进数据集并返回该数据集
            dsXml.ReadXml(memoryStreams);
            return dsXml;
        }

    2:组装XML

    下面是我本地测试写的简单示例

     public string GetXmlinfo()
        {
            DataSet dsXml = new DataSet();
            dsXml = commonws.GetDsSql("个人中心", "根据证件ID查询信息");
            string[] arryList = { "result" };
            string result = docHelper.CreatXmlTree(arryList, dsXml);
            string state = "0";
            string stateMessage = "交易成功";
            #region XML组装(详细参数result节点)
            StringBuilder returnXml = new StringBuilder();
            returnXml.Append("<?xml version="1.0" encoding="utf-8"?>");
            returnXml.Append("<response>");
            returnXml.Append("<resultCode>" + state + "</resultCode>");
            returnXml.Append("<resultMessage>" + stateMessage + "</resultMessage>");
            returnXml.Append(result);
            returnXml.Append("</response>");
            #endregion
            return Getxml(returnXml.ToString());
        }

    以上代码除了固定的xml头,我们所拼接的其实是result内容节点,其他都是固定值,以及写死的固定参数值

    其中:

    CreatXmlTree是本次组装节点的重点
    result是本次传入的节点名称,实际根据XML要求名称即可
    string[] arryList = { "result" };
    string result = docHelper.CreatXmlTree(arryList, dsXml);
    CreatXmlTree组装方法展示如下:
    /// <summary>
        /// </summary>
        /// <param name="Xmlparam">内容节点分支名称(以组的形式展示节点名称)</param>
        /// <param name="dsDataXml">数据集Dataset形式打开</param>
        /// <returns></returns>
        public string CreatXmlTree(object[] Xmlparam, DataSet dsDataXml)
        {
            DataTable dt = dsDataXml.Tables[0];//获取到表
            string xmlt1 = Xmlparam[0].ToString();//外节点0 result 获取到节点内容名称
            string Temo = string.Empty;
            string xmlAdd = string.Empty;
            XElement XEle = new XElement("XML");//实例化定义中必须要有值,后面可根据自己变量的传参为准
            for (int j = 0; j < dsDataXml.Tables[0].Rows.Count; j++)//循环获取到数据行(与列名一一对应)
            {
                XEle = new XElement(xmlt1);//拼接节点元素开始
                for (int i = 0; i < dsDataXml.Tables[0].Columns.Count; i++)//循环获取内容字段的列名
                {
                    string strRows = string.Empty;//测试
                    string strColumns = dsDataXml.Tables[0].Columns[i].ToString();//测试
                    try
                    {
                        strRows = dsDataXml.Tables[0].Rows[j][i].ToString(); //遍历后同时获取列名 + 每行首字段依次开始的值
                    }
                    catch (Exception ex)
                    { }
                    XEle.Add(
                    new XElement(strColumns, strRows)//组装XML
                    );  
                }
                xmlAdd += XEle.ToString();
            }
    
            return xmlAdd.ToString();
        }

    返回生成的XML节点展示(如下)

    <?xml version="1.0" encoding="utf-8"?>
    <response>
        <resultCode>0</resultCode>
        <resultMessage>交易成功</resultMessage>
        <result>
            <patId>0000026723</patId>
            <patType></patType>
            <patName>曾金培</patName>
            <patSex></patSex>
            <patBirth>19550717</patBirth>
            <patAddress>和平</patAddress>
            <patMobile>18776580849</patMobile>
            <patCardType>居民身份证</patCardType>
            <patCardNo>000002672320200924</patCardNo>
            <admissionNo></admissionNo>
        </result>
    </response>

    到此结束,再也不想再去拼装模型,一个个在拼装起来!大家可以尝试下,我会把源码分享出来,有什么不足的可供大家参考修改。

    thanks the life give me courage.
  • 相关阅读:
    Visual Studio工具 vcpkg简介
    可跨平台C++开源图形图像框架:openFrameworks
    Visual Studio2017 设置了vcpkg之后,编译其他程序出问题
    PCL 3维点云的模板匹配
    Eigen库和STL容器冲突问题
    C 和 CPP 混合代码cmath编译出错
    VS2017在Release下编译错误C1001
    伪随机数
    和求余运算巧妙结合的jns指令
    [显示属性]-自定义桌面里没有IE选项
  • 原文地址:https://www.cnblogs.com/inthere/p/13795645.html
Copyright © 2011-2022 走看看