2009-06-29 1 views
1

次のXMLファイルは、常に検証されるようです。理由はわかりませんが、次の 'xmlns = "urn:schemas-microsoft-com:office:spreadsheet"を削除すると、検証エラーが予想どおりにスローされているようです。このファイルに対して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

+0

スローされ、そしてどのようなソフトウェアは、あなたが検証を実行するために使用していますか? – skaffman

+0

あなたは "それは検証エラーを予期した通りに投げるようです" – skaffman

答えて

0

あなたがここにその名前空間を参照してください:FullColumnsとX:Xと

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

FullRows

+0

これは私の質問にどのように答えますか? – eschneider

+0

あなたは言った: xmlns = "urn:schemas-microsoft-com:office:spreadsheet" '、それは期待どおりの検証エラーをスローするようです。 その名前空間がXMLで参照されるため、このエラーが発生します。 –

1

はあなたのXSDは何の効果も持っていません。 urn:schemas-microsoft-com:office:spreadsheetのxsdは、おそらく.NETフレームワークに組み込まれていて、どこに明示的にバリデーターを伝えていなくても使用されています。これは、スキーマ検証のルール内で許可されます。

+0

埋め込みOfficeスキーマではなく、コードを使用して自分のXSDスキーマで検証しています。 – eschneider

+0

この現象を防ぐ方法を知っていますか? – jlp

+0

@jlp - それは私が十分によく知っている.netの領域で​​はありませんが、通常、デフォルトのものをオーバーライドするために独自のリソースローダ/リゾルバを提供する方法があります。リモートURLからxsdsとDTDをロードするとき、それらのサーバーは多くの場合、あるクライアントからの要求の数を制限します。したがって、ほとんどの言語はリソースリゾルバをオーバーライドするためのメカニズムを提供するため、ローカルストアからアクセスできます。 – Alohci

関連する問題