2009-06-29 67 views
1

下面的xml文件似乎總是驗證。不知道爲什麼,但是當我刪除以下「的xmlns =‘甕:架構 - 微軟COM:辦公室:電子表格’」,它似乎應該拋出一個驗證錯誤。爲什麼XSD驗證總是適用於這個文件?

不知何故MS阻止驗證與所添加的XSD 辦公室架構。因此,無論何時包含XSD架構,您都無法使用.NET框架驗證XML。

Option Strict On 
Option Explicit On 

Imports System.IO 
Imports System.Xml 
Imports System.Xml.Schema 
Imports System.Text 

Public Class XMLValidator2 

    Private _isValid As Boolean = False 

    'Validation Error Count 
    Private _ErrorsCount As Integer = 0 

    'Validation Error Message 
    Private _ErrorMessage As String = "" 

    'Declare local objects 
    Private _tr As XmlTextReader 
    Private _xr As XmlTextReader 
    Private _xsc As XmlSchemaSet 
    Private _vr As XmlReader 

    Public Sub Validate(ByVal strXMLDocPath As String, ByVal strXSDPath As String) 

     Try 

      _isValid = False 
      'Text reader object 
      _tr = New XmlTextReader(strXSDPath) 
      _xsc = New XmlSchemaSet 
      _xsc.Add("", _tr) 

      'Validator Object 
      Dim settings As New XmlReaderSettings() 
      settings.Schemas.Add(_xsc) 
      settings.ValidationType = ValidationType.Schema 
      'Add validation event handler 
      AddHandler settings.ValidationEventHandler, AddressOf Me.ValidationHandler 
      _vr = XmlReader.Create(strXMLDocPath, settings) 

      _ErrorsCount = 0 
      _ErrorMessage = "" 

      'Validate XML data 
      While (_vr.Read()) 
      End While 
      _vr.Close() 
      ' Raise exception, if XML validation fails 
      If (_ErrorsCount > 0) Then Throw New Exception(_ErrorMessage) 
      'XML Validation succeeded 
      _isValid = True 

     Catch ex As System.Exception 
      'XML Validation failed 
      Throw New Exception(ex.Message) 
     End Try 
    End Sub 

    Private Sub ValidationHandler(ByVal sender As Object, ByVal args As ValidationEventArgs) 
     _ErrorMessage = _ErrorMessage + args.Message + "\r\n" 
     _ErrorsCount = +1 
    End Sub 

    Public ReadOnly Property bIsValid() As Boolean 
     Get 
      Return _isValid 
     End Get 
    End Property 
End Class 

<?xml version="1.0"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"> 
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> 
    <LastAuthor>KLIMMPI</LastAuthor> 
    <Created>2009-06-04T13:49:21Z</Created> 
    <LastSaved>2009-06-04T16:10:37Z</LastSaved> 
    <Version>11.9999</Version> 
</DocumentProperties> 
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> 
    <Colors> 
    <Color> 
    <Index>17</Index> 
    <RGB>#663399</RGB> 
    </Color> 
    <Color> 
    <Index>39</Index> 
    <RGB>#E3E3E3</RGB> 
    </Color> 
    <Color> 
    <Index>45</Index> 
    <RGB>#FF3300</RGB> 
    </Color> 
    </Colors> 
</OfficeDocumentSettings> 
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
    <WindowHeight>8790</WindowHeight> 
    <WindowWidth>30840</WindowWidth> 
    <WindowTopX>480</WindowTopX> 
    <WindowTopY>90</WindowTopY> 
    <ProtectStructure>False</ProtectStructure> 
    <ProtectWindows>False</ProtectWindows> 
</ExcelWorkbook> 
<Styles> 
    <Style ss:ID="Default" ss:Name="Normal"> 
    <Alignment ss:Vertical="Bottom"/> 
    <Borders/> 
    <Font/> 
    <Interior/> 
    <NumberFormat/> 
    <Protection/> 
    </Style> 
    <Style ss:ID="s22" ss:Name="Normal_Not 8 Counts"> 
    <Alignment ss:Vertical="Bottom"/> 
    <Borders/> 
    <Font ss:FontName="Arial "/> 
    <Interior/> 
    <NumberFormat/> 
    <Protection/> 
    </Style> 
    <Style ss:ID="s24"> 
    <Font ss:Bold="1"/> 
    </Style> 
    <Style ss:ID="s25" ss:Parent="s22"> 
    <Alignment ss:Horizontal="Right" ss:Vertical="Center"/> 
    <Borders/> 
    <Font ss:FontName="Arial "/> 
    <Interior/> 
    <NumberFormat/> 
    </Style> 
    <Style ss:ID="s26" ss:Parent="s22"> 
    <Alignment ss:Horizontal="Left" ss:Vertical="Center"/> 
    <Borders/> 
    <Font ss:FontName="Arial "/> 
    <Interior/> 
    <NumberFormat/> 
    </Style> 
    <Style ss:ID="s27"> 
    <Borders/> 
    <Font ss:Bold="1"/> 
    <Interior/> 
    </Style> 
    <Style ss:ID="s28"> 
    <Borders/> 
    <Interior/> 
    </Style> 
    <Style ss:ID="s29"> 
    <Alignment ss:Horizontal="Right" ss:Vertical="Bottom"/> 
    <Borders/> 
    <Interior/> 
    <NumberFormat ss:Format="@"/> 
    </Style> 
</Styles> 
<Worksheet ss:Name="Not 8 Counts"> 
    <Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="8" x:FullColumns="1" 
    x:FullRows="1"> 
    <Column ss:AutoFitWidth="0" ss:Width="101.25"/> 
    <Column ss:StyleID="s28" ss:AutoFitWidth="0" ss:Width="66.75"/> 
    <Column ss:StyleID="s28" ss:AutoFitWidth="0" ss:Width="52.5"/> 
    <Column ss:StyleID="s28" ss:AutoFitWidth="0" ss:Width="117.75"/> 
    <Column ss:AutoFitWidth="0" ss:Width="62.25"/> 
    <Column ss:Index="7" ss:AutoFitWidth="0" ss:Width="68.25"/> 
    <Row> 
    <Cell ss:StyleID="s24"><Data ss:Type="String">SPAccountIdentifier</Data></Cell> 
    <Cell ss:StyleID="s27"><Data ss:Type="String">SPUIAccount</Data></Cell> 
    <Cell ss:StyleID="s27"><Data ss:Type="String">SPFein</Data></Cell> 
    <Cell ss:StyleID="s27"><Data ss:Type="String">SPLegalName</Data></Cell> 
    <Cell ss:StyleID="s24"><Data ss:Type="String">SPRateYear</Data></Cell> 
    <Cell ss:Index="7" ss:StyleID="s24"><Data ss:Type="String">Notes</Data></Cell> 
    </Row> 
    <Row> 
    <Cell><Data ss:Type="Number">1</Data></Cell> 
    <Cell><Data ss:Type="Number">204006</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">397221</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">Fake</Data></Cell> 
    <Cell><Data ss:Type="Number">2009</Data></Cell> 
    <Cell ss:Index="7"><Data ss:Type="String">open subject</Data></Cell> 
    <Cell><Data ss:Type="String">Account number dropped proceeding zeros</Data></Cell> 
    </Row> 
    <Row> 
    <Cell><Data ss:Type="Number">2</Data></Cell> 
    <Cell ss:StyleID="s29"><Data ss:Type="String">0018008</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">3905530</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">Fake</Data></Cell> 
    <Cell><Data ss:Type="Number">2009</Data></Cell> 
    <Cell ss:Index="8"><Data ss:Type="String">account number should be 001008</Data></Cell> 
    </Row> 
    <Row> 
    <Cell><Data ss:Type="Number">6</Data></Cell> 
    <Cell ss:StyleID="s25"><Data ss:Type="String">04045002</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">3915659</Data></Cell> 
    <Cell ss:StyleID="s26"><Data ss:Type="String">FAKE</Data></Cell> 
    <Cell><Data ss:Type="Number">2009</Data></Cell> 
    </Row> 
    <Row> 
    <Cell ss:Index="2" ss:StyleID="s29"/> 
    </Row> 
    </Table> 
    <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
    <Print> 
    <ValidPrinterInfo/> 
    <HorizontalResolution>600</HorizontalResolution> 
    <VerticalResolution>600</VerticalResolution> 
    <NumberofCopies>0</NumberofCopies> 
    </Print> 
    <Selected/> 
    <Panes> 
    <Pane> 
    <Number>3</Number> 
    <ActiveRow>13</ActiveRow> 
    <ActiveCol>3</ActiveCol> 
    </Pane> 
    </Panes> 
    <ProtectObjects>False</ProtectObjects> 
    <ProtectScenarios>False</ProtectScenarios> 
    </WorksheetOptions> 
</Worksheet> 
</Workbook> 

XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Address"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Recipient" type="xs:string" /> 
     <xs:element name="House" type="xs:string" /> 
     <xs:element name="Street" type="xs:string" /> 
     <xs:element name="Town" type="xs:string" /> 
     <xs:element name="County" type="xs:string" minOccurs="0" /> 
     <xs:element name="PostCode" type="xs:string" /> 
     <xs:element name="Country"> 
      <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="FR" /> 
       <xs:enumeration value="DE" /> 
       <xs:enumeration value="ES" /> 
       <xs:enumeration value="UK" /> 
       <xs:enumeration value="US" /> 
      </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+0

沒有錯誤拋出 – eschneider 2009-06-29 21:45:50

+0

它拋出什麼驗證錯誤,和您使用什麼軟件進行驗證? – skaffman 2009-06-29 21:45:59

+0

你說:「它似乎應該拋出一個驗證錯誤」 – skaffman 2009-06-29 21:46:29

回答

0

你指的是這裏的命名空間:

<Worksheet ss:Name="Not 8 Counts"> 
    <Table ss:ExpandedColumnCount="8" ss:ExpandedRowCount="8" x:FullColumns="1" x:FullRows="1"> 

與X:FullColumns和X:FullRows

1

你的XSD是有沒有影響。對於骨灰盒的XSD:架構 - 微軟COM:辦公室:電子表格被來自其他地方的回升,可能建在.NET Framework中,即使你沒有明確告訴驗證哪裏可以找到它被使用。這是模式驗證規則中允許的。

相關問題