如何用C#生成一个多层次结构的XML文件....
比如...我有表A,表B,表C,表D,表E,表F,或是更多
如果我要用以上其中的几个表生成一个多层次结构的XML文件怎么去处理呢
而且。。生成XML文件这一步骤代码应该是公共的
大家一起来说说。讨论讨论
考虑:
1,XML多层次结构。。
2,如里有两到三个表生成XML节点是同级关系。。
3,如果要GROUP BY
4。等等
比如...我有表A,表B,表C,表D,表E,表F,或是更多
如果我要用以上其中的几个表生成一个多层次结构的XML文件怎么去处理呢
而且。。生成XML文件这一步骤代码应该是公共的
大家一起来说说。讨论讨论
考虑:
1,XML多层次结构。。
2,如里有两到三个表生成XML节点是同级关系。。
3,如果要GROUP BY
4。等等
如果要实现更复杂的逻辑,只能自已写了,参见MSDN: XmlDocument
new DataTable().WriteXml("xxx");
只能生成...三个节点...而且..不管怎么样的数据..都只是这几个节点...
我是想...
把每个表都生成一个XML...
然后根据父子关系..把XML都组合成一个.....
C# 操纵XML文件
已经够你用了呀.又不知道你逻辑,XmlDocument 里面的方法已相当简单了....
按你自已的逻辑生成XML就可以了撒.
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
多个表生成XML...而且表不是固定的...我可以随便传...或是查询后的数据集...
根据主外键表的关系...
如果是你..你会怎么做呢?
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;
/// 把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;
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;
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";
这写都是你定义的节点么???
怎么没有注释啊...
對我就是傳入一個數據集。。到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是
如果在.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>
那麼。。我把查詢語句寫在存儲過程裏。。
在存儲過程。。生成我想要的XML
那麼。。如果在SQLSERVER2005裏。。要生成自定義多層次結構的XML要怎麼做呢?
這樣出來的是簡單的啊。。
我要的是。。復雜的XML
如果我寫有十個表。。那麼。這個XML就有可能生成十一個節點其中包括一個根節點。。
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");
这位大哥..什么方法可以生成..
用C#还是.NET...
速回..
好簡單?怎麼不說說呢
出XML的數據全是動態的不會是固定的數據。。
節點也是動態的。。
Programmatically using ADO.NET and XML
我就是不想。每次生成XML的時候。。都去根據表的數據去改XML生成代碼。。
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("");
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文件。。