Почему проверка XSD всегда работает для этого файла? - PullRequest
1 голос
/ 30 июня 2009

Кажется, что следующий xml-файл всегда проверяется. Не знаю почему, но когда я удаляю следующее 'xmlns = "urn: schemas-microsoft-com: office: spreadsheet"', кажется, что выдается ошибка проверки, как и ожидалось.

Каким-то образом MS препятствует проверке с добавленной схемой XSD office . Поэтому в любое время, когда включена схема XSD, вы не можете проверять XML с помощью .NET Framework.

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>

Ответы [ 3 ]

1 голос
/ 04 июля 2009

Ваш XSD не имеет никакого эффекта. Xsd для urn: schemas-microsoft-com: office: spreadsheet извлекается из других источников, возможно, встроен в среду .net и используется, даже если вы явно не сказали валидатору, где его найти. Это разрешено в рамках правил проверки схемы.

1 голос
/ 16 марта 2011

Следующее сработало в моем случае:

settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings

Будьте осторожны, это может вызвать другие ошибки, которые обычно игнорируются.

исх: http://www.dotnetspider.com/resources/2971-Validating-an-XML-File-using-XSD-NET.aspx

0 голосов
/ 30 июня 2009

Вы ссылаетесь на это пространство имен здесь:

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

с x: FullColumns и x: FullRows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...