读取pdm格式的文件生成json数据对象,拼接字符串的笨方法[实质是读取xml文件生成json数据对象]...

1.首先从这个pdm文件文件中抽出xml的"一张表":

<?xml version="1.0" encoding="gb2312"?>

<Model xmlns:a="attribute" xmlns:c="collection" xmlns:o="object">
  <o:Table Id="o6">
    <a:ObjectID>4305BC1B-3526-4E12-8C6C-C1BF0F5C59D2</a:ObjectID>
    <a:Name>模板</a:Name>
    <a:Code>CMS_TEMP</a:Code>
    <a:CreationDate>1332832430</a:CreationDate>
    <a:Creator>Administrator</a:Creator>
    <a:ModificationDate>1348554434</a:ModificationDate>
    <a:Modifier>Administrator</a:Modifier>
    <a:TotalSavingCurrency/>
    <c:Columns>
     
      <o:Column Id="o33">
        <a:ObjectID>F38BE5C1-7917-46CE-8FD6-33E625869DAA</a:ObjectID>
        <a:Name>内码</a:Name>
        <a:Code>PK_ID</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332837878</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>panint</a:DataType>
        <a:Mandatory>1</a:Mandatory>
      </o:Column>
      <o:Column Id="o34">
        <a:ObjectID>E4999851-9628-4317-A740-74BA62CE8788</a:ObjectID>
        <a:Name>编号</a:Name>
        <a:Code>TEMP_NO</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332837334</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>panvarchar(50)</a:DataType>
        <a:Length>50</a:Length>
      </o:Column>
      <o:Column Id="o35">
        <a:ObjectID>58139FAE-C9F1-477C-B261-2B8D53EAF1DF</a:ObjectID>
        <a:Name>名称</a:Name>
        <a:Code>TEMP_NAME</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332837334</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>panvarchar(50)</a:DataType>
        <a:Length>50</a:Length>
      </o:Column>
      <o:Column Id="o36">
        <a:ObjectID>0FD8A3F9-A5C5-4794-B1EB-2DF835BA4C51</a:ObjectID>
        <a:Name>类型</a:Name>
        <a:Code>FK_TEMP_TYPE</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332837878</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>panint</a:DataType>
      </o:Column>
      <o:Column Id="o37">
        <a:ObjectID>AEF02063-FBBB-4E24-A9C1-DE92DB7C9FB2</a:ObjectID>
        <a:Name>内容</a:Name>
        <a:Code>TEMP_CONTENT</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332833706</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>pantext</a:DataType>
      </o:Column>
      <o:Column Id="o38">
        <a:ObjectID>1398C477-2E7A-4793-BAB9-6B907462FD08</a:ObjectID>
        <a:Name>日期</a:Name>
        <a:Code>TEMP_TIME</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332833706</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>pandate</a:DataType>
      </o:Column>
      <o:Column Id="o39">
        <a:ObjectID>F31AD368-FF19-42A3-A668-EF14CBBCF38C</a:ObjectID>
        <a:Name>备注</a:Name>
        <a:Code>TEMP_NOTE</a:Code>
        <a:CreationDate>1348554342</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1348554434</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <a:DataType>panvarchar(100)</a:DataType>
        <a:Length>100</a:Length>
      </o:Column>
     
    </c:Columns>
    <c:Keys>
      <o:Key Id="o40">
        <a:ObjectID>5C4F7786-029E-41E7-842A-64DDA2BA8CA9</a:ObjectID>
        <a:Name>PK_CMS_TEMP</a:Name>
        <a:Code>PK_CMS_TEMP</a:Code>
        <a:CreationDate>1332832430</a:CreationDate>
        <a:Creator>Administrator</a:Creator>
        <a:ModificationDate>1332836773</a:ModificationDate>
        <a:Modifier>Administrator</a:Modifier>
        <c:Key.Columns>
          <o:Column Ref="o33"/>
        </c:Key.Columns>
      </o:Key>
    </c:Keys>
    <c:PrimaryKey>
      <o:Key Ref="o40"/>
    </c:PrimaryKey>
    <c:ClusterObject>
      <o:Key Ref="o40"/>
    </c:ClusterObject>
  </o:Table>
</Model>

2.下面是读取这张xml格式"表格"的方法:

/// <summary>

        /// From A Table Generate  JSON Objects

        /// </summary>

        /// <returns></returns>

        public string GenerateJSON(XmlNode ATable, XmlNamespaceManager xmlnsManager)

        {

            XmlNode name = ATable.SelectSingleNode("a:Name", xmlnsManager);

            XmlNode TrueName = ATable.SelectSingleNode("a:Code", xmlnsManager);

            string TName = string.Empty;

            if (name != null)

            {

                TName += "{Name:\"" + TrueName.InnerText + "\",";//表名称

                TName += "Title:\"" + name.InnerText + "\",";

                //Response.Write(TName);

            }

            //XmlNodeList columns = ATable.SelectSingleNode("c:Columns", xmlnsManager).ChildNodes;//1

            XmlNodeList columns = ATable.SelectNodes("c:Columns/o:Column", xmlnsManager);//1

            StringBuilder builder = new StringBuilder();

            builder.Append("[");

            //循环多列

            foreach (XmlNode nodeColumn in columns)

            {

                //Response.Write("<script>alert('" +  + "')</script>");

                string nodeColumnName = nodeColumn.SelectSingleNode("a:Name", xmlnsManager).InnerText;

                string TrueNodeColumnName = nodeColumn.SelectSingleNode("a:Code", xmlnsManager).InnerText;

                string nodeColumnType = nodeColumn.SelectSingleNode("a:DataType", xmlnsManager).InnerText;

                XmlNode nodeLength = nodeColumn.SelectSingleNode("a:Length", xmlnsManager);

                string nodeColumnlength = string.Empty;

                int ZERO = 0;

                if (nodeLength != null)

                {

                    nodeColumnlength = nodeColumn.SelectSingleNode("a:Length", xmlnsManager).InnerText;

                }

                else

                {

                    nodeColumnlength = ZERO.ToString();

                }

                //convert  the builder.ToString(); 为ajson

                builder.Append("{Name:\"" + TrueNodeColumnName + "\",Title:\"" + nodeColumnName + "\",Type:\"" + nodeColumnType + "\",Length:" + nodeColumnlength + "},");

            }

            builder.Append("]");

            string resStr = "Column:" + builder.ToString().Remove(builder.Length - 2, 1);

            resStr += ",";//生成队列信息 

 

            #region 下面是找主键信息

            XmlNode PrimaryKeyNode = ATable.SelectSingleNode("//c:PrimaryKey/o:Key", xmlnsManager);//2

            string PrimaryKeyID = string.Empty;

            if (PrimaryKeyNode != null)

                PrimaryKeyID = PrimaryKeyNode.Attributes["Ref"].Value;

            else return "";//未能找到xml的主键信息列

            // Response.Write(PrimaryKeyID);

            XmlNode nodeAtt = ATable.SelectSingleNode("//c:Keys/o:Key[@Id='" + PrimaryKeyID + "']", xmlnsManager);//3

            string primaryName = nodeAtt.SelectSingleNode("a:Name", xmlnsManager).InnerText;//主键信息

            //Response.Write(primaryName);

            XmlNode xmlAttID = nodeAtt.SelectSingleNode("c:Key.Columns/o:Column", xmlnsManager);//主键信息

            string xmlPrimaryId = xmlAttID.Attributes["Ref"].Value;//主键信息

            //Response.Write(xmlPrimaryId);

            XmlNode xmlNodePrimary = ATable.SelectSingleNode("//c:Columns/o:Column[@Id='" + xmlPrimaryId + "']", xmlnsManager);//4

            string xmlNodePrimaryName = xmlNodePrimary.SelectSingleNode("a:Code", xmlnsManager).InnerText;主键信息名字

            string xmlPrimaryNameMain = "PrimaryKey:\"" + xmlNodePrimaryName + "\",";//string:primaryString json格式对象

            //Response.Write(xmlPrimaryNameMain);

            string xmlIdx = "idx:\"" + xmlNodePrimaryName + "\"}";

            return TName + resStr + xmlPrimaryNameMain + xmlIdx;

            #endregion

        }

3.循环pdm文件中的多个xml"表格",动态代码如下:

        /// <summary>

        /// 多张表生成json格式对象

        /// </summary>

        /// <returns></returns>

        public string ForeachTable()

        {

            string resJSON = string.Empty;

            XmlDocument xmldoc = new XmlDocument();

            XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);

            xmlnsManager.AddNamespace("a", "attribute");

            xmlnsManager.AddNamespace("c", "collection");

            xmlnsManager.AddNamespace("o", "object");

            xmldoc.Load(Server.MapPath("~/bin/cms.pdm"));

            XmlElement root = xmldoc.DocumentElement;

            if (root == null)

                return "";

            //对个节点集合

            XmlNodeList MultipleTable = root.SelectNodes("//Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table", xmlnsManager);

            resJSON += "[";

            foreach (XmlNode table in MultipleTable)

            {

                resJSON += GenerateJSON(table, xmlnsManager) + ",";

            }

            resJSON += "]";

            resJSON.Remove(resJSON.Length - 2, 1);

            return resJSON;

        }

4.拼接字符串是一种方法,但是比较麻烦,所以还可以用到Dictionary和List泛型集合集成数据,既可以序列化成json格式数据的对象!

  下面是用一般处理程序下的泛型集合改的:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using System.Collections;
using System.Web.Script.Serialization;
using System.IO;
using Microsoft.SqlServer;
using System.Collections.Generic;
using System.Xml;

public class Handler : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";

JavaScriptSerializer js = new JavaScriptSerializer();
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
list = ForeachTable();
string jsonMultipleTable = js.Serialize(list);
context.Response.Write(jsonMultipleTable);
context.Response.Write("<br />");
}
/// <summary>
/// 负责调用该方法,生成json对象
/// </summary>
/// <returns></returns
public List<Dictionary<string, object>> ForeachTable()
{
string resJSON = string.Empty;
List<System.Collections.Generic.Dictionary<string, object>> listMultipleTalbe = new List<Dictionary<string, object>>();
XmlDocument xmldoc = new XmlDocument();
System.Xml.XmlNamespaceManager xmlnsManager = new System.Xml.XmlNamespaceManager(xmldoc.NameTable);
xmlnsManager.AddNamespace("a", "attribute");
xmlnsManager.AddNamespace("c", "collection");
xmlnsManager.AddNamespace("o", "object");
xmldoc.Load(HttpContext.Current.Request.MapPath("~/file/cms.pdm"));
XmlElement root = xmldoc.DocumentElement;
if (root == null)
return null;
//
XmlNodeList MultipleTable = root.SelectNodes("//Model/o:RootObject/c:Children/o:Model/c:Tables/o:Table", xmlnsManager);
foreach (XmlNode table in MultipleTable)
{
listMultipleTalbe.Add(GenerateJSON(table, xmlnsManager));
}
return listMultipleTalbe;
}
/// <summary>
/// From A Table Generate JSON Objects
/// </summary>
/// <returns></returns>
public Dictionary<string, object> GenerateJSON(XmlNode ATable, XmlNamespaceManager xmlnsManager)
{
Dictionary<string, object> DicTable = new Dictionary<string, object>();//a table
List<Dictionary<string, string>> listColumn = new List<Dictionary<string, string>>();//multiple column
Dictionary<string, string> DicMultipleColumn = null;//a column
XmlNode name = ATable.SelectSingleNode("a:Name", xmlnsManager);
XmlNode TrueName = ATable.SelectSingleNode("a:Code", xmlnsManager);
string TName = string.Empty;
if (name != null)
{
DicTable.Add("Name", TrueName.InnerText);
DicTable.Add("Title", name.InnerText);
}
XmlNodeList columns = ATable.SelectNodes("c:Columns/o:Column", xmlnsManager);//1
//循环多列
foreach (XmlNode nodeColumn in columns)
{
string nodeColumnName = nodeColumn.SelectSingleNode("a:Name", xmlnsManager).InnerText;
string TrueNodeColumnName = nodeColumn.SelectSingleNode("a:Code", xmlnsManager).InnerText;
string nodeColumnType = nodeColumn.SelectSingleNode("a:DataType", xmlnsManager).InnerText;
XmlNode nodeLength = nodeColumn.SelectSingleNode("a:Length", xmlnsManager);
string nodeColumnlength = string.Empty;
int ZERO = 0;
if (nodeLength != null)
{
nodeColumnlength = nodeColumn.SelectSingleNode("a:Length", xmlnsManager).InnerText;
}
else
{
nodeColumnlength = ZERO.ToString();
}
// DicMultipleColumn.Clear();
//每一列对应的new一个新dictionary
DicMultipleColumn = new Dictionary<string, string>();
DicMultipleColumn.Add("Name", TrueNodeColumnName);
DicMultipleColumn.Add("Title", nodeColumnName);
DicMultipleColumn.Add("Type", nodeColumnType);
DicMultipleColumn.Add("Length", nodeColumnlength);
listColumn.Add(DicMultipleColumn);
}
DicTable.Add("Column", listColumn);
XmlNode PrimaryKeyNode = ATable.SelectSingleNode("//c:PrimaryKey/o:Key", xmlnsManager);//2
string PrimaryKeyID = string.Empty;//找到主键Ref
if (PrimaryKeyNode != null)
PrimaryKeyID = PrimaryKeyNode.Attributes["Ref"].Value;
else return null;//未能找到PrimaryKey
XmlNode nodeAtt = ATable.SelectSingleNode("//c:Keys/o:Key[@Id='" + PrimaryKeyID + "']", xmlnsManager);//3
string primaryName = nodeAtt.SelectSingleNode("a:Name", xmlnsManager).InnerText;//主键名字;
XmlNode xmlAttID = nodeAtt.SelectSingleNode("c:Key.Columns/o:Column", xmlnsManager);//主键名字
string xmlPrimaryId = xmlAttID.Attributes["Ref"].Value;//主键id
XmlNode xmlNodePrimary = ATable.SelectSingleNode("//c:Columns/o:Column[@Id='" + xmlPrimaryId + "']", xmlnsManager);//4
string xmlNodePrimaryName = xmlNodePrimary.SelectSingleNode("a:Code", xmlnsManager).InnerText;//主键的名字
DicTable.Add("PrimaryKey", xmlNodePrimaryName);
DicTable.Add("idx", xmlNodePrimaryName);
return DicTable;

}
public bool IsReusable
{
get
{
return false;
}
}

}

 

5.如上只是一种思想,希望各位指正!

 

 

转载于:https://www.cnblogs.com/LpRightNow/archive/2012/12/17/2821257.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值