SSIS - XML验证错误 - “预期的架构根”

时间:2016-01-12 19:24:08

标签: xml ssis xsd xsd-validation

我在SSIS包中有一个XML任务,它在运行时给出了以下错误:

Error: 0xC002F304 at XML Task, XML Task: An error occurred with the following error
  message: "Expected schema root. Make sure the root element is <schema> and the 
  namespace is 'http://www.w3.org/2001/XMLSchema' for an XSD schema or 
  'urn:schemas-microsoft-com:xml-data' for an XDR schema.".

以下是XML文档的示例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Item xmlns="http://path.to.namespace.com">
    <Name>Notebook</Name>
    <Price>4.95</Price>
</Item>

XSD文档看起来像这样(重新格式化为更适合这里 - 在实际的XSD中,架构标记都是一行):

<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
               targetNamespace="http://path.to.namespace.com" 
               xmlns="http://path.to.namespace.com" 
               elementFormDefault="qualified">

<!-- id_ps -->
<xs:element name="Item">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Name" type="xs:string"/>
            <xs:element name="Price" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

</xs:schema>

我通过一些在线验证器运行XSD / XML组合,看起来很好。我甚至取出了所有文件连接,并为任务上的XML和XSD完成了直接输入,以排除任何文件权限 - 完全相同的错误。

这是我的XML任务配置:

Input
  Operation Type:         Validate
  Source Type:            Direct Input
  Source:                 (see above XML)

Output
  SaveOperationResult:    False

Second Operand
  SecondOperandType:      Direct Input
  SecondOperand:          (see above XSD)

Validation options
  ValidationType:         XSD
  FailOnValidationFail:   False

我没有大量的XML / XSD经验,XSD是由第三方供应商生成的。

有什么我在这里完全不见了吗?

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,用VB代替ScriptTask。它执行以下操作:

  1. 从SSIS包中将XML作为字符串变量。
  2. 删除ExecuteSQLTask添加的一些标记。
  3. 将字符串读入XMLDocument。
  4. 将架构从文件路径添加到XMLDocument。
  5. 验证XML。
  6. 使用StreamWriter写出XML。
  7. 检查出来:

    Dim XMLstring As String = Dts.Variables("User::XMLvariable").Value.ToString()
    Dim XMLdoc As XmlDocument = New XmlDocument()
    
    'Remove ROOT tags that show up.
    XMLstring = XMLstring.Replace("<ROOT>", "")
    XMLstring = XMLstring.Replace("</ROOT>", "")
    
    XMLdoc.LoadXml(XMLstring)
    
    XMLdoc.Schemas.Add(Nothing, "XSDFile.xsd")
    
    Try
        XMLdoc.Validate(Nothing)
    Catch ex As XmlException
        Dts.Events.FireError(0, "XML Error", "Error:" + ex.Message, String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
        Exit Sub
    Catch ex As Exception
        Dts.Events.FireError(0, "Error", "Error:" + ex.Message, String.Empty, 0)
        Dts.TaskResult = ScriptResults.Failure
        Exit Sub
    End Try
    
    Dim sw As New IO.StreamWriter("ExportFile.xml")
    XMLdoc.Save(sw)
    sw.Dispose()
    Dts.TaskResult = ScriptResult.Success
    

    我确定应该有更多错误检查和所有内容,这只是一个简单的形式。完全接受建议和调整。

    从这里获得帮助和示例:

    http://www.vbforums.com/showthread.php?528172-VB-NET-code-to-validate-xml-against-xsd-file http://www.codeproject.com/Articles/10444/Simple-code-to-validate-an-XML-file-against-a-sche