DB中2个表, PurchaseOrder 是主表,LineItem 是从表内容, xml属性是DB的列, 如何实现查询DB后生成xml为 下面效果呢,c#代码?
<?xml version="1.0"?>
<!DOCTYPE PurchaseOrder [
  <!ELEMENT PurchaseOrder (LineItem+)>
  <!ATTLIST PurchaseOrder
     POID CDATA #REQUIRED
     PurchaseOrderNumber CDATA #REQUIRED
     RevisionNumber CDATA #REQUIRED
     StatusID CDATA #REQUIRED
     RequestDate CDATA #REQUIRED>
  <!ELEMENT LineItem ANY>
  <!ATTLIST LineItem
          SKUID CDATA #REQUIRED
          POID CDATA #REQUIRED
          Size CDATA #REQUIRED
          Color CDATA #REQUIRED
          Style CDATA #REQUIRED
          RetailPrice CDATA #REQUIRED
          SKUQuantity CDATA #REQUIRED
          LineItemNo CDATA #REQUIRED>
]><PurchaseOrder POID="94784" PurchaseOrderNumber="010001" 
RevisionNumber="000" StatusID="Downloaded" RequestDate="12042004">
  <LineItem SKUID="3300003617" POID="94784" Size="M" Color="Red" 
Style="DarkSun" RetailPrice="24.8" SKUQuantity="400" LineItemNo="001"/>
  <LineItem SKUID="3300003621" POID="94784" Size="M" Color="Black" 
Style="DarkSun" RetailPrice="24.8" SKUQuantity="400" LineItemNo="002"/>
</PurchaseOrder> 

解决方案 »

  1.   

    先把2个表FILL到一个DataSet ds中;DataRelation dr=new DataRelation("PK_POID",ds.Tables["PurchaseOrder"].Columns["POID"],
                                      ds.Tables["LineItem"].Columns["POID"]);dr.Nested=true;
    ds.Relations.Add(dr);foreach(DataColumn col in ds.Tables["PurchaseOrder"].Columns);
        col.ColumnMapping=MappingType.Attribute;foreach(DataColumn col in ds.Tables["LineItem"].Columns);
        col.ColumnMapping=MappingType.Attribute;ds.WriteXml(@"e:\123.xml");
      

  2.   

    多谢, 现在是 <?xml version="1.0" standalone="yes" ?> 
    - <NewDataSet>
    - <PurchaseOrder 首尾多了个 <NewDataSet>
    如何解决 ?
      

  3.   

    用ds.WriteXml方法生成的XML文件都有这个<NewDataSet>根节点。可以通过更改ds.Name属性来改变这个节点名,但不能去除。如果一定药去除<NewDataSet>根节点就可能要通过XmlDocument来操作了:try:........
    ds.WriteXml(@"e:\123.xml");
    XmlDocument doc=new XmlDocument();
    doc.Load(@"e:\123.xml");XmlNode node=doc.DocumentElement.ChildNodes[0];
    doc.RemoveChild(doc.DocumentElement);doc.AppendChild(node);
    doc.Save(@"e:\123.xml");
      

  4.   

    数据库里主表数据1条时正常, >1 时报错 :
    异常详细信息: System.ArgumentException: 不能启用此约束,因为不是所有的值都具有相应的父值。不能启用此约束,因为不是所有的值都具有相应的父值。
      

  5.   

    行 56:  ds.Relations.Add(dr);不能启用此约束,因为不是所有的值都具有相应的父值。
    if ((Request.QueryString["poID"]!=null)&&(Request.QueryString["poID"]!=String.Empty))
    {
    string s =Request.QueryString["poID"] ;

    adp.SelectCommand = new OleDbCommand("select * from Ice_poinfo_line where poid=?",conn)
    ;
    adp.SelectCommand.Parameters.Add("poid",OleDbType.VarChar,20).Value=s;
    }
    else
    {
    adp.SelectCommand = new OleDbCommand("select * from Ice_poinfo_line ",conn) ;
    }
    // try
    {
    adp.Fill(ds,"PurchaseOrder");
    adp.SelectCommand = new OleDbCommand("select * from Ice_poinfo_line2",conn);
    adp.Fill(ds,"LineItem");
      

  6.   

    先adp.Fill,最后才ds.Relations.Add(dr);
      

  7.   

    数据成了 先显示主表, 后显示所有从表 ,怎么办 ? <PurchaseOrder POID="94784" PURCHASEORDERNUMBER="010001" REVISIONNUMBER="000" STATUS="Downloaded" REQUESTDATE="11162004" /> 
      <PurchaseOrder POID="94785" PURCHASEORDERNUMBER="010002" REVISIONNUMBER="000" STATUS="Accepted" REQUESTDATE="11182004" /> 
      <LineItem SKU_ID="3300003645" POID="94785" size="L" COLOR="Green" RETAILPRICE="30" STYLE="DC" SKUQUANTITY="500" LINEITEMNO="001" /> 
      <LineItem SKU_ID="3300003617" POID="94784" size="M" COLOR="Red" RETAILPRICE="24.8" STYLE="DarkSun" SKUQUANTITY="400" LINEITEMNO="001" /> 
      

  8.   

    而且生成为 <PurchaseOrder ... /> <从表内容 />如何把显示  /> 替换成  <PurchaseOrder >
                             <从表内容>
                             </从表内容>
                            </PurchaseOrder>
      

  9.   

    DataRelation dr=new DataRelation("PK_POID",ds.Tables["PurchaseOrder"].Columns["POID"],
                                      ds.Tables["LineItem"].Columns["POID"]);dr.Nested=true; //你是不是没有设置这个
      

  10.   

    哦,多谢! 不小心注释了 :)马上揭帖拉再问一下, 如何在 这个Dataset 中对里面的数据编辑? 如过滤 某属性值< 20 的
      

  11.   

    1、可以通过adp.SelectCommand中的SQL语句过滤。2、在Dataset操作的话。可以试试:   //RetailPrice是列名
       ds.Tables["PurchaseOrder"].DefaultView.RowFilter="RetailPrice<20";   or   ds.Tables["PurchaseOrder"].DefaultView.RowFilter="RetailPrice<'20'";