数据库中只有一个表,每行为一份产品图纸的信息,如图号,图名,所属装配图号等,需要的xml文件格式如下:
其中每个item项代表一份图纸,嵌套关系按实际装配结构,即所属装配关系来构造。
<?xml version='1.0' encoding='gb2312'?>
<tree id="0">
<item drawing_id="drawing" graphname="图纸">
  <item drawing_id="drawing_sp1" graphname="图纸1">
    <item drawing_id="drawing_sp_sp"  graphname="图纸1.1">
      <item drawing_id="drawing_sp_sp_sp"  graphname="图纸1.1.1"/>
    </item>
  </item>
  <item drawing_id="drawing_sp2" graphname="图纸.2"/>
  <item drawing_id="drawing_sp3" graphname="图纸.3"/>
  <item drawing_id="drawing_sp4" graphname="图纸.4"/>
  <item drawing_id="drawing_sp5" graphname="图纸.5"/>
  <item drawing_id="drawing_sp6" graphname="图纸.6"/>
</item>
</tree>

解决方案 »

  1.   

    楼主想要得到的结果表是什么?
    为什么用for xml不太容易达到目标, 觉得可以的啊.
      

  2.   

    --想要的结果是不是下面的这个?
    --openxml可以用meta属性,得到数据在xml中的层次信息
    图号, 图名, 所属装配图号
    drawing           图纸     null
    drawing_sp1 图纸1     drawing
    drawing_sp_sp         图纸1.1     drawing_sp1
    drawing_sp_sp_sp    图纸1.1.1     drawing_sp_sp
    drawing_sp2 图纸     drawing
    drawing_sp3 图纸     drawing
    drawing_sp4 图纸     drawing
    drawing_sp5 图纸     drawing
    drawing_sp6 图纸     drawing
      

  3.   

    --这里我们假定嵌套的层次不超过10层, 运行时修改一个bulk insert的路径名就可以了
    --如果嵌套的次数也不清楚的话,那我就不会做了
    DECLARE @hDoc int
    declare @doc varchar(8000)
    declare @xpath nvarchar(40)
    declare @loop int, @i int
    create table result(图号 varchar(20), 图名 varchar(20), 
    所属装配图号 varchar(20), 
    id int,
    parent_id int)
    create table #hfile ( file_text varchar(8000))
    bulk insert #hfile from 'H:\temp\xml\abc.xml'
    set @doc=''
    select @doc=@doc+file_text from #hfile
    EXEC sp_xml_preparedocument @hDoc OUTPUT, @doc--select* from #hfile
    --循环读取xml的数据
    select @xpath='/tree/item', @i=0, @loop=10 --设置嵌套的次数
    while @i<@loop
    begin
    insert result(图号, 图名,id, parent_id)
    select *  
    from openxml(@hDoc, @xpath)
    with (图号 varchar(20) './@drawing_id',
          图名 varchar(20) './@graphname',
          id int '@mp:id',
          parent_id int '@mp:parentid')
    select @xpath=@xpath+'/item', @i=@i+1
    endselect t1.图号, t1.图名, t2.图号 as 所属装配号
    from result t1 left join result t2 on t1.parent_id=t2.id
    --扫尾
    drop table #hfile
    drop table result
      

  4.   

    感谢filebat的热情回复,不过我想你误解我的意思了,在我的数据库中关于图纸信息的表已经存在了(以后会通过其他方式继续添加其他产品信息),我的意思是想从已经存在的表中通过查询得到指定格式的xml数据,然后要存为xml文件以供其他应用函数调用。表的格式和你说的差不多,基本如下,当然还有其他一些信息,但主要就是这几项了。图号, 图名, 所属装配图号
    drawing           图纸     null
    drawing_sp1 图纸1     drawing
    drawing_sp_sp         图纸1.1     drawing_sp1
    drawing_sp_sp_sp    图纸1.1.1     drawing_sp_sp
    drawing_sp2 图纸     drawing
    drawing_sp3 图纸     drawing
    drawing_sp4 图纸     drawing
    drawing_sp5 图纸     drawing
    drawing_sp6 图纸     drawing而通过查询此表想得到我上文提到那种格式的xml结果,如果用forXML语句,因为只有一个表,用auto模式怎么才能反映出各行数据的所属关系呢?用explicit模式太复杂,目前还没想到什么办法。
      

  5.   

    多谢,如果再没有高手指点,偶只好用最笨的办法,先查询出结果集,然后在java中或jsp中用递归函数逐级取出相关信息,然后编程得到xml文件了。
    希望能有人前来指点一下!
      

  6.   

    哦,仔细看了一下。
    原来我做的是从xml到关系表,而楼主要是从关系表到xml。
    呵呵,用for xml好像是很有点复杂。不会, 关注