如何用C#生成一个多层次结构的XML文件....
比如...我有表A,表B,表C,表D,表E,表F,或是更多
如果我要用以上其中的几个表生成一个多层次结构的XML文件怎么去处理呢
而且。。生成XML文件这一步骤代码应该是公共的
大家一起来说说。讨论讨论
考虑:
1,XML多层次结构。。
2,如里有两到三个表生成XML节点是同级关系。。
3,如果要GROUP BY
4。等等

解决方案 »

  1.   

    new DataTable().WriteXml("xxx");
    如果要实现更复杂的逻辑,只能自已写了,参见MSDN: XmlDocument
      

  2.   


    new DataTable().WriteXml("xxx");
    只能生成...三个节点...而且..不管怎么样的数据..都只是这几个节点...
    我是想...
    把每个表都生成一个XML...
    然后根据父子关系..把XML都组合成一个.....
      

  3.   

    参考
    C# 操纵XML文件
      

  4.   


    已经够你用了呀.又不知道你逻辑,XmlDocument 里面的方法已相当简单了....
    按你自已的逻辑生成XML就可以了撒.
      

  5.   

    XmlDocument xmldoc = new XmlDocument();  
    XmlNode xmlnode = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null);  
    xmldoc.AppendChild(xmlnode);  XmlElement xmlelem = xmldoc.CreateElement("", "", "");  
    XmlText xmltext = xmldoc.CreateTextNode("");  
    xmlelem.AppendChild(xmltext);  
    xmldoc.AppendChild(xmlelem);  

    xmldoc.LoadXml("");
    还有XMLTextWrite
    http://topic.csdn.net/u/20100405/18/7a2ac7db-fd5b-4032-8175-1160165821b8.html
      

  6.   


    多个表生成XML...而且表不是固定的...我可以随便传...或是查询后的数据集...
    根据主外键表的关系...
    如果是你..你会怎么做呢?
      

  7.   

    xpath
    xquery要了解
    public class XMLTranslation
        {        string xpathPERSON_KEY = "/PERSON/PERSON_KEY";
            string xpathHR_CODE = "/PERSON/HR_CODE";
            string xpatHR_ID = "/PERSON/HR_ID";
            string xpathNAME = "/PERSON/NAME";
            string xpathNAME_PY = "/PERSON/NAME_PY";
            string xpathBIRTHDAY = "/PERSON/BIRTHDAY";
            string xpathID_NO = "/PERSON/ID_NO";
            string xpathWORK_UNIT = "/PERSON/WORK_UNIT";
            string xpathTEL = "/PERSON/TEL";
            string xpathCONTACT_NAME = "/PERSON/CONTACT_NAME";
            string xpathCONTACT_TEL = "/PERSON/CONTACT_TEL";
            string xpathADDRESS = "/PERSON/ADDRESS";
            string xpathAREA_GROUPCODE = "/PERSON/AREA_GROUPCODE";
            string xpathIS_PUBLICE = "/PERSON/IS_PUBLIC";
            string xpathSTATUS = "/PERSON/STATUS";
            string xpathNOW_PERSON_KEY = "/PERSON/NOW_PERSON_KEY";
            string xpathUSER_CREATE = "/PERSON/USER_CREATE";
            string xpathUSER_LAST_MODI = "/PERSON/USER_LAST_MODI";
            string xpathDATE_CREATE = "/PERSON/DATE_CREATE";
            string xpathDATE_UPDATE = "/PERSON/DATE_UPDATE";
            string xpathREMARK = "/PERSON/REMARK";
            string xpathIS_PERFECT = "/PERSON/IS_PERFECT";        string xpathGENDERCODE = "/PERSON/GENDER/KEY";
            string xpathGENDERNAME = "/PERSON/GENDER/NAME";
            string xpathRSOPR = "/PERSON/RSOPR/KEY";
            string xpathRSOPRNAME = "/PERSON/RSOPR/NAME";
            string xpathNATION = "/PERSON/NATION/KEY";
            string xpathNATIONNAME = "/PERSON/NATION/NAME";
            string xpathABO = "/PERSON/ABO/KEY";
            string xpathABONAME = "/PERSON/ABO/NAME";
            string xpathRH = "/PERSON/RH/KEY";
            string xpathRHNAME = "/PERSON/RH/NAME";
            string xpathEDUCATION = "/PERSON/EDUCATION/KEY";
            string xpathEDUCATIONNAME = "/PERSON/EDUCATION/NAME";
            string xpathOCCUPATION = "/PERSON/OCCUPATION/KEY";
            string xpathOCCUPATIONNAME = "/PERSON/OCCUPATION/NAME";
            string xpathMARRIAGE = "/PERSON/MARRIAGE/KEY";
            string xpathMARRIAGENNAME = "/PERSON/MARRIAGE/NAME";
            string xpathAREA = "/PERSON/AREA/KEY";
            string xpathAREANAME = "/PERSON/AREA/NAME";
            string xpathORIGIN_AREA = "/PERSON/ORIGIN_AREA/KEY";
            string xpathORIGIN_AREANAME = "/PERSON/ORIGIN_AREA/NAME";
            string xpathBIRTH_AREA = "/PERSON/BIRTH_AREA/KEY";
            string xpathBIRTH_AREANAME = "/PERSON/BIRTH_AREA/NAME";
            string xpathREGISTERED_AREA = "/PERSON/REGISTERED_AREA/KEY";
            string xpathREGISTERED_AREANAME = "/PERSON/REGISTERED_AREA/NAME";
            string xpathFATHER = "/PERSON/FATHER/KEY";
            string xpathFATHERNAME = "/PERSON/FATHER/NAME";
            string xpathMOTHER = "/PERSON/MOTHER/KEY";
            string xpathMOTHERNAME = "/PERSON/MOTHER/NAME";
            string xpathSPOUSE = "/PERSON/SPOUSE/KEY";
            string xpathSPOUSENAME = "/PERSON/SPOUSE/NAME";        string xpathDEFORMITYLIST = "/PERSON/DEFORMITYLIST";
            string xpathHEREDITYLIST = "/PERSON/HEREDITYLIST";
            string xpathOPSLIST = "/PERSON/OPSLIST";
            string xpathPAST_DISEASELIST = "/PERSON/PAST_DISEASELIST";
            string xpathALLERGYLIST = "/PERSON/ALLERGYLIST";
            string xpathPAYMENTLIST = "/PERSON/PAYMENTLIST";
            string xpathTRANSFUSIONLIST = "/PERSON/TRANSFUSIONLIST";
            /// <summary>
            /// 把xml翻译成PersonInfo
            /// </summary>
            /// <param name="person_id"></param>
            /// <returns></returns>
            public PersonInfo GetPersonXmlInfo(string xmlView)
            {
                PersonInfo o_info = new PersonInfo();
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xmlView);
              
                EModelINF_PERSONinfo person = new EModelINF_PERSONinfo();
                person.PERSON_KEY = xmlDoc.SelectNodes(xpathPERSON_KEY)[0].InnerText;
                person.HR_CODE = xmlDoc.SelectNodes(xpathHR_CODE)[0].InnerText;
                person.HR_ID = xmlDoc.SelectNodes(xpatHR_ID)[0].InnerText;
                person.NAME = xmlDoc.SelectNodes(xpathNAME)[0].InnerText;
                person.NAME_PY = xmlDoc.SelectNodes(xpathNAME_PY)[0].InnerText;
                try
                {
                    person.BIRTHDAY = Convert.ToDateTime(xmlDoc.SelectNodes(xpathBIRTHDAY)[0].InnerText);
                }
                catch
                {
                }
                person.ID_NO = xmlDoc.SelectNodes(xpathID_NO)[0].InnerText;
                person.WORK_UNIT = xmlDoc.SelectNodes(xpathWORK_UNIT)[0].InnerText;
                person.TEL = xmlDoc.SelectNodes(xpathTEL)[0].InnerText;
                person.CONTACT_NAME = xmlDoc.SelectNodes(xpathCONTACT_NAME)[0].InnerText;
                person.CONTACT_TEL = xmlDoc.SelectNodes(xpathCONTACT_TEL)[0].InnerText;
                person.ADDRESS = xmlDoc.SelectNodes(xpathADDRESS)[0].InnerText;
                person.AREA_GROUPCODE = xmlDoc.SelectNodes(xpathAREA_GROUPCODE)[0].InnerText;
                person.IS_PUBLIC = xmlDoc.SelectNodes(xpathIS_PUBLICE)[0].InnerText;
                person.STATUS = xmlDoc.SelectNodes(xpathSTATUS)[0].InnerText;
      

  8.   

    /// <summary>
            ///  把PersonInfo翻译成xml
            /// </summary>
            /// <param name="?"></param>
            /// <returns></returns>
            public string GetINF_PERSON_XMLVIEWinfo(PersonInfo personInfo)
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(System.Web.HttpContext.Current.Server.MapPath("~/Person/xmlperson_temp.xml"));                        xmlDoc.SelectNodes(xpathPERSON_KEY)[0].InnerText = personInfo.Person.PERSON_KEY;
                xmlDoc.SelectNodes(xpathHR_CODE)[0].InnerText = personInfo.Person.HR_CODE;
                xmlDoc.SelectNodes(xpatHR_ID)[0].InnerText = personInfo.Person.HR_ID;
                xmlDoc.SelectNodes(xpathNAME)[0].InnerText = personInfo.Person.NAME;
                xmlDoc.SelectNodes(xpathNAME_PY)[0].InnerText = personInfo.Person.NAME_PY;
                xmlDoc.SelectNodes(xpathBIRTHDAY)[0].InnerText = (personInfo.Person.BIRTHDAY != null ? personInfo.Person.BIRTHDAY.ToString() : "");
                xmlDoc.SelectNodes(xpathID_NO)[0].InnerText = personInfo.Person.ID_NO;
                xmlDoc.SelectNodes(xpathWORK_UNIT)[0].InnerText = personInfo.Person.WORK_UNIT;
                xmlDoc.SelectNodes(xpathTEL)[0].InnerText = personInfo.Person.TEL;
                xmlDoc.SelectNodes(xpathCONTACT_NAME)[0].InnerText = personInfo.Person.CONTACT_NAME;
                xmlDoc.SelectNodes(xpathCONTACT_TEL)[0].InnerText = personInfo.Person.CONTACT_TEL;
                xmlDoc.SelectNodes(xpathADDRESS)[0].InnerText = personInfo.Person.ADDRESS;
      

  9.   

     XmlNode xmlNodeDEFORMITYLIST = xmlDoc.SelectNodes(xpathDEFORMITYLIST)[0];
                string str_deformity = string.Empty;
                foreach (EINF_PERSON_DEFORMITYinfo dEFORMITY in personInfo.PersonDeformity)
                {
                    str_deformity += "<DEFORMITY>";
                    str_deformity += "<ID>" + dEFORMITY.ID + "</ID>";
                    str_deformity += "<PERSON_KEY>" + dEFORMITY.PERSON_KEY + "</PERSON_KEY>";
                    str_deformity += "<DEFORMITY_CODE>" + dEFORMITY.DEFORMITY_CODE+ "</DEFORMITY_CODE>";
                    str_deformity += "<DATE_UPDATE>" + dEFORMITY.DATE_UPDATE + "</DATE_UPDATE>";
                    str_deformity += "<DEFORMITY_NAME>" + dEFORMITY.DEFORMITY_NAME + "</DEFORMITY_NAME>";
                    str_deformity += "</DEFORMITY>";
                }
                xmlNodeDEFORMITYLIST.InnerXml = str_deformity;
      

  10.   


    string xpathPERSON_KEY = "/PERSON/PERSON_KEY";
      string xpathHR_CODE = "/PERSON/HR_CODE";
      string xpatHR_ID = "/PERSON/HR_ID";
      string xpathNAME = "/PERSON/NAME";
      string xpathNAME_PY = "/PERSON/NAME_PY";
      string xpathBIRTHDAY = "/PERSON/BIRTHDAY";
      string xpathID_NO = "/PERSON/ID_NO";
      string xpathWORK_UNIT = "/PERSON/WORK_UNIT";
    这写都是你定义的节点么???
    怎么没有注释啊...
      

  11.   

    难道你想用XML来代替数据库?如果这样,最难的是Select语句, 其他的可以参考http://topic.csdn.net/u/20100405/18/7a2ac7db-fd5b-4032-8175-1160165821b8.html
      

  12.   

    你也可以去拼接字符串,最后再输出为XML,这样的优点就是比较灵活随意另外,生成XML跟你本身的查询没关系吧,查询并得到结果与生成XML要分开,传给XML生成方法的只有一个参数那就是数据集
      

  13.   


    對我就是傳入一個數據集。。到XML生成方法裏去。
    比如:
    我有
    A  衣服表 ,
    B  衣服款式表,
    C  衣服颜色表,
    D  衣服尺碼表,
    E  衣服數量表。
    這些表裏都有主外健關系的
    我寫一個查詢語句
    select A.衣服名,B.衣服款式,C.衣服颜色表,D.衣服尺碼表,E.衣服數量表
    from A,B,C,D,E
    where ...條件查詢結果有兩條
    A.衣服名,B.衣服款式,C.衣服颜色表,D.衣服尺碼表,E.衣服數量表
      西裝      款式          黑          XL           10
      衬衫      款式          白          X            20<?xml version="1.0" encoding="UTF-8"?>
    <As>
    <A>
    <A-Name>西裝</A-Name>
       <B>
      <B-Type>款式</B-Type>
      <C-D>
      <C-color>黑</C-color>
      <D-size>XL</D-size>
      <E-qty>
      <qty>10</qty>
      </E-qty>
      </C-D>
       </B>
    </A>
    <A>
    <A-Name>衬衫</A-Name>
       <B>
      <B-Type>款式</B-Type>
      <C-D>
      <C-color>白</C-color>
      <D-size>X</D-size>
      <E-qty>
      <qty>20</qty>
      </E-qty>
      </C-D>
       </B>
    </A>
    </As>
    要生成的XML是
      

  14.   

    或許能直接用SQLSERVER2005生成我想要層次XML文件麼?
      

  15.   

    用xmldocument,xmlelement,xmlreader,xmlwriter就已经可以了吧,至于怎么构造要看楼主的需求喽
      

  16.   


    如果在.net裏寫生成XML文檔的話。
    這個方法就要公用
    不管我傳進去的什麼數據集都能生成比如:
    我有
    A 衣服表 ,
    B 衣服款式表,
    C 衣服颜色表,
    D 衣服尺碼表,
    E 衣服數量表。
    這些表裏都有主外健關系的
    我在.NET寫一個查詢語句
    select A.衣服名,B.衣服款式,C.衣服颜色表,D.衣服尺碼表,E.衣服數量表
    from A,B,C,D,E
    where ...條件查詢結果有兩條
    A.衣服名,B.衣服款式,C.衣服颜色表,D.衣服尺碼表,E.衣服數量表
      西裝 款式 黑 XL 10
      衬衫 款式 白 X 20
    傳到生成XML公用方法裏面後。。生成出來的效果:<?xml version="1.0" encoding="UTF-8"?>
    <As>
        <A>
        <A-Name>西裝</A-Name>
           <B>
              <B-Type>款式</B-Type>
              <C-D>
                  <C-color>黑</C-color>
                  <D-size>XL</D-size>
                  <E-qty>
                      <qty>10</qty>
                  </E-qty>
              </C-D>
           </B>
        </A>
        <A>
        <A-Name>衬衫</A-Name>
           <B>
              <B-Type>款式</B-Type>
              <C-D>
                  <C-color>白</C-color>
                  <D-size>X</D-size>
                  <E-qty>
                      <qty>20</qty>
                  </E-qty>
              </C-D>
           </B>
        </A>
    </As>
      

  17.   

    所以。。我在想。。如果公用生成XML的方法在.net裏面不能完成。。
    那麼。。我把查詢語句寫在存儲過程裏。。
    在存儲過程。。生成我想要的XML
    那麼。。如果在SQLSERVER2005裏。。要生成自定義多層次結構的XML要怎麼做呢?
      

  18.   

    直接使用DATASET.WriteXML一下就出来了
      

  19.   


     這樣出來的是簡單的啊。。
    我要的是。。復雜的XML
    如果我寫有十個表。。那麼。這個XML就有可能生成十一個節點其中包括一個根節點。。
      

  20.   

    既然你能得到树状结构了,那你不如用sql直接把字符串拼好了得了。XmlDocument xmlDocument = new XmlDocument();
                XPathNavigator xp = xmlDocument.CreateNavigator();
                xp.AppendChild(@"<As>
                                    <A>
                                    <A-Name>西裝</A-Name>
                                       <B>
                                          <B-Type>款式</B-Type>
                                          <C-D>
                                              <C-color>黑</C-color>
                                              <D-size>XL</D-size>
                                              <E-qty>
                                                  <qty>10</qty>
                                              </E-qty>
                                          </C-D>
                                       </B>
                                    </A>
                                    <A>
                                    <A-Name>衬衫</A-Name>
                                       <B>
                                          <B-Type>款式</B-Type>
                                          <C-D>
                                              <C-color>白</C-color>
                                              <D-size>X</D-size>
                                              <E-qty>
                                                  <qty>20</qty>
                                              </E-qty>
                                          </C-D>
                                       </B>
                                    </A>
                                </As>
                                ");
                xmlDocument.Save(@"c:\abc.xml");
      

  21.   


    这位大哥..什么方法可以生成..
    用C#还是.NET...
    速回..
      

  22.   


    好簡單?怎麼不說說呢
    出XML的數據全是動態的不會是固定的數據。。
    節點也是動態的。。
      

  23.   

    参考这篇文章,Ado.net的DataSet对xml的支持很好的,可以很方便处理xml文件:
    Programmatically using ADO.NET and XML
      

  24.   


    我就是不想。每次生成XML的時候。。都去根據表的數據去改XML生成代碼。。
      

  25.   

    XmlDocument xmldoc = new XmlDocument();  
    XmlNode xmlnode = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null);  
    xmldoc.AppendChild(xmlnode);  XmlElement xmlelem = xmldoc.CreateElement("", "", "");  
    XmlText xmltext = xmldoc.CreateTextNode("");  
    xmlelem.AppendChild(xmltext);  
    xmldoc.AppendChild(xmlelem);  

    xmldoc.LoadXml("");
      

  26.   


    select 
    1 as tag,
    null as parent,
    A.ordseq  as [ord!1!ordseq!element],
    A.ordseq as  [ord!1!ordno!element],
    A.ordty as  [ord!1!ordty!element],
    null as  [orditm!2!itmno!element],
    null as  [orditm!2!prd!element],
    null as  [orditmcl!3!cl!element],
    null as  [orditmcl!3!sz!element],
    null as  [orditmcl!3!qty!element]
    from ord A --where A.ordseq='10000'
    union all
    select 
    2 ,
    1 ,
    A.ordseq,
    A.ordseq ,
    A.ordty ,
    B.itmno ,
    B.prd,
    null ,
    null ,
    null
    from orditm B,ord A
    where A.ordseq=B.ordseq --and A.ordseq='10000'union allselect 
    3 ,
    2 ,
    A.ordseq,
    A.ordseq ,
    A.ordty ,
    B.itmno ,
    B.prd,
    C.clname ,
    D.szname,
    E.qty
    from orditmdtl E,orditmsz D,orditmcl C,orditm B,ord A
    where A.ordseq=B.ordseq --and A.ordseq='10000'
    and   B.ordseq=E.ordseq and B.itmno=E.itmno
    and   B.ordseq=C.ordseq and B.itmno=C.itmno
    and   B.ordseq=D.ordseq and B.itmno=D.itmno
    and   E.ordseq=C.ordseq and E.itmno=C.itmno and E.clno=C.clno
    and   E.ordseq=D.ordseq and E.itmno=D.itmno and E.clno=D.szno
    order by [ord!1!ordseq!element],[orditm!2!itmno!element],[orditmcl!3!qty!element]
    for xml EXPLICIT,root('root')
    SQL可以這樣生成自定義的XML文件。。