以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  请教如下XSD 定义问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=12391)


--  作者:guyang2000
--  发布时间:11/30/2004 11:46:00 AM

--  请教如下XSD 定义问题
I have two tables and a xml, xsd file 使用SQLXMLBulkLoad load xml 数据进入俩表时出错:
"Invalid value for column "NAME"",

"NAME" 是一个嵌套元素但在表中没有该字段。 表示 FIRST-NAME and LAST-NAME. 高手执教what's wrong for the xsd file "NAME" parts。 谢谢.

1. tables:
----------------------------------------------------------------------------------------------------
PAYOR(bankID, PRNAME,PENAME, TRN,BREF,DTM097, DTM107,TTLAMT,TRNCNT)
ENT (bank, FIRST-NAME,LAST-NAME,ACNUM,CR,CREF,DTM109)

ENT(bank) is foreign key refer to PAYOR(bankID)
--------------------------------------------------------------------------------------------------------
2. XML File

<?xml version="1.0" ?>
<ROOT>
   <PAYOR bankID="001">
      <PRNAME>BANK</PRNAME>
      <PENAME>CUST</PENAME>
      <TRN>2222</TRN>
      <BREF>3333</BREF>
      <DTM097>4444</DTM097>
      <DTM107>1111</DTM107>
      <TTLAMT>300</TTLAMT>
      <TRNCNT>2</TRNCNT>
   </PAYOR>

   <ENT bank="001">
      <NAME>
         <FIRST-NAME>AAA</FIRST-NAME>
         <LAST-NAME>AAA</LAST-NAME>
      </NAME>
      <ACNUM>001001001</ACNUM>
      <CR>100</CR>
      <CREF>1111</CREF>
      <DTM109>1111</DTM109>
   </ENT>
   <ENT bank="001">
      <NAME>
         <FIRST-NAME>BBB</FIRST-NAME>
         <LAST-NAME>BBB</LAST-NAME>
      </NAME>
      <ACNUM>002002002</ACNUM>
      <CR>200</CR>
      <CREF>1111</CREF>
      <DTM109>1111</DTM109>
   </ENT>
</ROOT>
----------------------------------------------------------------------------
3. Create a XSD file for the XML to database mapping:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema" elementFormDefault="qualified">

<xs:annotation>
  <xs:appinfo>
  <sql:relationship name="BANK-ENT" parent="PAYOR" parent-key="bankID" child="ENT" child-key="bank">
  </sql:relationship>
</xs:appinfo>
</xs:annotation>

<xs:element name="ACNUM" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="BREF" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="CR" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="CREF" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="DTM109" type="xs:string" sql:datatype="varchar(128)"/>

<xs:element name="ROOT">
 <xs:complexType>
 <xs:sequence>
                         <xs:element ref="PAYOR" maxOccurs="unbounded"/>
                         <xs:element ref="ENT" maxOccurs="unbounded"/>
 </xs:sequence>
 </xs:complexType>
 </xs:element>

<xs:element name="ENT" sql:relation="ENT" sql:relationship ="BANK-ENT">
 <xs:complexType>
 <xs:sequence>
  <xs:element ref="NAME"/>
  <xs:element ref="ACNUM"/>
                        <xs:element ref="CR"/>
                     <xs:element ref="CREF"/>
  <xs:element ref="DTM109"/>
 </xs:sequence>
                    <xs:attribute name="bank" type="xs:string" use="required" sql:datatype="varchar(128)"/>
 </xs:complexType>
 </xs:element>

<xs:element name="FIRST-NAME" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="LAST-NAME" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="NAME">
 <xs:complexType>
 <xs:sequence>
  <xs:element ref="FIRST-NAME"/>
  <xs:element ref="LAST-NAME"/>
 </xs:sequence>
 </xs:complexType>
 </xs:element>

<xs:element name="PAYOR" sql:relation="PAYOR">
                <xs:complexType>
 <xs:sequence>
  <xs:element ref="PRNAME"/>
  <xs:element ref="PENAME"/>
  <xs:element ref="TRN"/>
  <xs:element ref="BREF"/>
  <xs:element ref="DTM097"/>
  <xs:element ref="DTM050" minOccurs="0"/>
  <xs:element ref="DTM107"/>
  <xs:element ref="TTLAMT"/>
  <xs:element ref="TRNCNT"/>
 </xs:sequence>
 <xs:attribute name="bankID" type="xs:string" use="required" sql:datatype="varchar(128)"/>
 </xs:complexType>
 </xs:element>
<xs:element name="PENAME" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="PRNAME" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="TRN" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="DTM097" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="DTM050" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="DTM107" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="TTLAMT" type="xs:string" sql:datatype="varchar(128)"/>
<xs:element name="TRNCNT" type="xs:string" sql:datatype="varchar(128)"/>
</xs:schema>



--  作者:doubleG
--  发布时间:11/30/2004 2:25:00 PM

--  
这个应该不是XSD的问题吧,这个XML是valid的。也就是说通过了xsd的检验,我觉得是你的SQLXMLBulkLoad的问题,它能处理怎样的XML呢,是否能够认得你的<NAME>标签下的那两个节点呢?他是只认第一层还是认最后一层呢?有可能只是认得最简单的XML,你将那两个字段用NAME包起来,在结构上清晰了,但是有可能就不被程序认了呢。个人观点仅供参考。
--  作者:guyang2000
--  发布时间:11/30/2004 11:06:00 PM

--  
SQLXMLBulkLoad 用的是  SQLXML 3.0. 在他的例子里没有看到=嵌套的两层的  。

在这里我们没有指定  " NAME" 影射到表的字段。
如果要过滤掉  "<NAME>" and "</NAME>", 如何的方法比较好些>


--  作者:doubleG
--  发布时间:12/1/2004 9:03:00 AM

--  
可以用xslt将该xml进行转换,将Name标签去掉,然后再使用SQLXMLBulkLoad。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="ROOT">
 <xsl:copy>
  <xsl:apply-templates/>
 </xsl:copy>
</xsl:template>

<xsl:template match="PAYOR ">
 <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="ENT">
 <xsl:copy >
 <xsl:for-each select="attribute::*">
  <xsl:attribute name="{name(.)}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:for-each>
  <xsl:for-each select="NAME/child::*">
   <xsl:copy-of select="."/>
  </xsl:for-each>
  <xsl:for-each select="NAME/following-sibling::*">
   <xsl:copy-of select="." />
  </xsl:for-each>
 </xsl:copy>
</xsl:template>
</xsl:stylesheet>
将其转换成能够解析的XML:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
 <PAYOR bankID="001">
  <PRNAME>BANK</PRNAME>
  <PENAME>CUST</PENAME>
  <TRN>2222</TRN>
  <BREF>3333</BREF>
  <DTM097>4444</DTM097>
  <DTM107>1111</DTM107>
  <TTLAMT>300</TTLAMT>
  <TRNCNT>2</TRNCNT>
 </PAYOR>
 <ENT bank="001">
  <FIRST-NAME>AAA</FIRST-NAME>
  <LAST-NAME>AAA</LAST-NAME>
  <ACNUM>001001001</ACNUM>
  <CR>100</CR>
  <CREF>1111</CREF>
  <DTM109>1111</DTM109>
 </ENT>
 <ENT bank="001">
  <FIRST-NAME>BBB</FIRST-NAME>
  <LAST-NAME>BBB</LAST-NAME>
  <ACNUM>002002002</ACNUM>
  <CR>200</CR>
  <CREF>1111</CREF>
  <DTM109>1111</DTM109>
 </ENT>
</ROOT>
然后再行处理就好了。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
61.523ms