Вопрос

Я пытаюсь проверить файл XML с XSD, но я получаю "Не удалось найти информацию схемы для элемента «XXX»«Для каждого элемента и атрибута.

Мой код C #:

public ReadeXmlFile(string FilePath)
{
    var settings = new XmlReaderSettings
    {
       IgnoreComments = true, 
       ValidationType = ValidationType.Schema,
       CheckCharacters=true,
       ValidationFlags= XmlSchemaValidationFlags.ReportValidationWarnings
    };
    settings.ValidationEventHandler += settings_ValidationEventHandler;
    var xsdReader = new XmlTextReader("KeyEmFileSchema.xsd");
    settings.Schemas.Add(null, xsdReader);

    using (var reader = XmlTextReader.Create(FilePath, settings))
    {
       while (reader.Read()){}
    }
}

void settings_ValidationEventHandler(object sender, ValidationEventArgs e)
{
     Debug.WriteLine(e.Severity + " - " + e.Message);
}

Мой XML-файл:

<?xml version="1.0" encoding="utf-16"?>
<keyem description="test"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xsi:noNamespaceSchemaLocation="http://tempuri.org/KeyEmFileSchema.xsd"
>
  <layout type="keyboard" height="300" width="300">
    <groupp text="rad 1">
      <key color="Black" macro="{ESC}10{ESC}43{MOUSERESET}" text="Ordi-\nnarie"/>
      <key color="Gray"  macro="{ESC}10{ESC}B0{MOUSERESET}" text="Släck\nskärm"/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2" icon="dfkhfkjsdhfkjdsf">
        <shift color="Blue"  macro="{ESC}1C{ESC}81{MOUSERESET}" text="Annan Skärm"/>
      </key>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
      <empty/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n4"/>
    </groupp>
    <group text="rad 2">
      <key color="Black" macro="{ESC}10{ESC}43{MOUSERESET}" text="Ordi-\nnarie"/>
      <key color="Gray"  macro="{ESC}10{ESC}B0{MOUSERESET}" text="Släck\nskärm"/>
      <group color ="Blue" text="test">
        <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
        <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2"/>
        <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
      </group>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2"/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
      <empty/>
      <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n4"/>
    </group>
  </layout>
</keyem>

Мой XSD файл

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="FileSchema"
    targetNamespace="http://tempuri.org/KeyEmFileSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/KeyEmFileSchema.xsd"
    xmlns:mstns="http://tempuri.org/KeyEmFileSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:annotation>
    <xs:documentation xml:lang="sv-se">Definition av layout</xs:documentation>
  </xs:annotation>

  <!--Definition av attribut-->
  <xs:attribute name="description" type="xs:string"/>
  <xs:attribute name="text"        type="xs:string"/>
  <xs:attribute name="height"      type="xs:positiveInteger"/>
  <xs:attribute name="width"       type="xs:positiveInteger"/>
  <xs:attribute name="type"        type="LayoutTypeSet" default="keyboard"/>
  <xs:attribute name="macro"       type="xs:string"/>
  <xs:attribute name="icon"        type="xs:base64Binary"/>
  <xs:attribute name="color"       type="ColorType"/>

  <!--Definition av attributgrupp-->
  <xs:attributeGroup name="ShiftKeyAttributeGroup">
    <xs:attribute ref="color" use="optional"/>
    <xs:attribute ref="macro" use="optional"/>
    <xs:attribute ref="text"  use="required"/>
    <xs:attribute ref="icon"  use="optional"/>
  </xs:attributeGroup>

  <!--Definition av root-->
  <xs:element name="keyem">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="layout" type="LayoutType" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute ref="description" use="optional"/>
    </xs:complexType>
  </xs:element>

  <!--Definition av komplexa typer-->
  <xs:complexType name="GroupKeyType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="LayoutType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attribute ref="type"   use="required"/>
    <xs:attribute ref="height" use="optional"/>
    <xs:attribute ref="width"  use="optional"/>
  </xs:complexType>

  <xs:complexType name="GroupType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="empty" type="EmptyType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attribute ref="text"  use="required"/>
    <xs:attribute ref="color" use="optional"/>
  </xs:complexType>

  <xs:complexType name="EmptyType">
    <xs:sequence>
      <xs:element name="empty"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ShiftType">
    <xs:attributeGroup ref="ShiftKeyAttributeGroup"/>
  </xs:complexType>

  <xs:complexType name="KeyType">
    <xs:sequence>
      <xs:element name="shift" type="ShiftType" minOccurs ="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attributeGroup ref="ShiftKeyAttributeGroup"/>
  </xs:complexType>


  <!--Definition av enkla typer-->
  <xs:simpleType      name="ColorType">
    <xs:restriction   base="xs:string">
      <!--Regex för att antingen matcha färg angivet på formen #rrggbb eller som är skriven i klarspråk, t.ex. "Green"-->
      <xs:pattern     value="\#[0-9a-fA-F]{6}|[a-zA-Z]+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType      name="LayoutTypeSet">
    <xs:restriction   base="xs:string">
      <xs:enumeration value="keyboard"/>
      <xs:enumeration value="list"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>
Это было полезно?

Решение

Если вы определили схему в KeyEmFileSchema.xsd файл, который вы можете использовать schemaLocation вместо noNamespaceSchemaLocation:

<keyem description="test"
      xmlns="http://tempuri.org/KeyEmFileSchema.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xsi:schemaLocation="http://tempuri.org/KeyEmFileSchema.xsd KeyEmFileSchema.xsd"
>

который определяет имя файла (он может быть с пути, если требуется) где определение http://tempuri.org/KeyEmFileSchema.xsd можно найти и использовать. Тогда вы можете использовать

XmlReaderSettings settings = new XmlReaderSettings ();
settings.ValidationType = ValidationType.Schema;
settings.IgnoreWhitespace = true;
settings.IgnoreComments = true;
settings.ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation;

XmlReader reader = XmlReader.Create (xmlFilePath, settings);

Если вы хотите, вы можете дополнительно использовать ValidationEventHandler. Отказ Без обработчика вы получите исключение с информацией о ошибках валидации.

Обновленный: Кстати после того, как xmlns="http://tempuri.org/KeyEmFileSchema.xsd" и xsi:schemaLocation="http://tempuri.org/KeyEmFileSchema.xsd KeyEmFileSchema.xsd" В корневом элементе вашего XML-файла вы будет видно уже в текстовом редакторе Visual Studio Ошибки в вашем XML-файле:

  1. Использование необъявленного атрибута description в keyem элемент.
  2. Использование всех атрибутов в layout элемент, который также не пренебрежен.
  3. Использование groupp элемент вместо group.

Обновлено 2.: Требование № 3: заменить groupp к group чисто. Потому что никто не прокомментировал мой ответ, я полагаю, что кто-то спрашивает: «Что не так с атрибутами файла XML?». Хорошо, я должен прокомментировать это больше.

Проблема в вашем файле XSD заключается в том, что вы объявляете атрибуты как Не часть некоторых простых типов, атрибута группы или атрибуты некоторых элементов. Отказ Вы просто объявляете некоторые «Независимые» атрибуты а затем использовать там ссылку на «REF». Это вообще возможно, но этот способ требует использования квалифицированный атрибуты. Отказ Поэтому, если вы не внесите изменения в своей схеме, фиксированная версия вашего XML-файла будет следовать

<?xml version="1.0" encoding="utf-16"?>
<keyem xmlns="http://tempuri.org/KeyEmFileSchema.xsd"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xsi:schemaLocation="http://tempuri.org/KeyEmFileSchema.xsd KeyEmFileSchema.xsd"
       a:description="test" xmlns:a="http://tempuri.org/KeyEmFileSchema.xsd"
>
    <layout a:type="keyboard" a:height="300" a:width="300">
        <group a:text="rad 1">
            <key a:color="Black" a:macro="{ESC}10{ESC}43{MOUSERESET}" a:text="Ordi-\nnarie"/>
            <key a:color="Gray"  a:macro="{ESC}10{ESC}B0{MOUSERESET}" a:text="Släck\nskärm"/>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n1"/>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n2" a:icon="dfkhfkjsdhfkjdsf">
                <shift a:color="Blue"  a:macro="{ESC}1C{ESC}81{MOUSERESET}" a:text="Annan Skärm"/>
            </key>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n3"/>
            <empty><empty/></empty>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n4"/>
        </group>
        <group a:text="rad 2">
            <key a:color="Black" a:macro="{ESC}10{ESC}43{MOUSERESET}" a:text="Ordi-\nnarie"/>
            <key a:color="Gray"  a:macro="{ESC}10{ESC}B0{MOUSERESET}" a:text="Släck\nskärm"/>
            <group a:color ="Blue" a:text="test">
                <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n1"/>
                <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n2"/>
                <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n3"/>
            </group>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n1"/>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n2"/>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n3"/>
            <empty><empty/></empty>
            <key a:color="Gray"  a:macro="{ESC}1B{ESC}81{MOUSERESET}" a:text="Skärm\n4"/>
        </group>

</layout>
</keyem>

Небольшое замечание: <empty> элемент неправильный определен в вашей схеме, поэтому следует следовать схеме, которую мы должны использовать его, как <empty><empty/></empty>.

Другая версия возможных изменений (которую вы, вероятно, предпочитаете) Чтобы разместить все атрибуты в определении элементов или группы атрибутов. Отказ Использование простых типов в вашем случае кажется мне не нужно. Таким образом, фиксированная версия схемы может быть следующей:

<?xml version="1.0" encoding="utf-16"?>
<xs:schema id="FileSchema"
    targetNamespace="http://tempuri.org/KeyEmFileSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/KeyEmFileSchema.xsd"
    xmlns:mstns="http://tempuri.org/KeyEmFileSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:annotation>
    <xs:documentation xml:lang="sv-se">Definition av layout</xs:documentation>
  </xs:annotation>

  <!--Definition av attributgrupp-->
  <xs:attributeGroup name="ShiftKeyAttributeGroup">
    <xs:attribute name="color" type="ColorType"/>
    <xs:attribute name="macro" type="xs:string"/>
    <xs:attribute name="text"  type="xs:string" use="required"/>
    <xs:attribute name="icon"  type="xs:base64Binary"/>
  </xs:attributeGroup>

  <!--Definition av root-->
  <xs:element name="keyem">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="layout" type="LayoutType" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
      <xs:attribute name="description" type="xs:string"/>
    </xs:complexType>
  </xs:element>

  <!--Definition av komplexa typer-->
  <xs:complexType name="GroupKeyType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="LayoutType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attribute name="type"   type="LayoutTypeSet" use="required"/>
    <xs:attribute name="height" type="xs:positiveInteger"/>
    <xs:attribute name="width"  type="xs:positiveInteger"/>
  </xs:complexType>

  <xs:complexType name="GroupType">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="group" type="GroupType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="key"   type="KeyType"   minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="empty" minOccurs="0" maxOccurs="unbounded"/>
    </xs:choice>
    <xs:attribute name="text" type="xs:string" use="required" />
    <xs:attribute name="color" type="ColorType"/>
  </xs:complexType>

  <xs:complexType name="ShiftType">
    <xs:attributeGroup ref="ShiftKeyAttributeGroup"/>
  </xs:complexType>

  <xs:complexType name="KeyType">
    <xs:sequence>
      <xs:element name="shift" type="ShiftType" minOccurs ="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attributeGroup ref="ShiftKeyAttributeGroup"/>
  </xs:complexType>

  <!--Definition av enkla typer-->
  <xs:simpleType      name="ColorType">
    <xs:restriction   base="xs:string">
      <!--Regex för att antingen matcha färg angivet på formen #rrggbb eller som är skriven i klarspråk, t.ex. "Green"-->
      <xs:pattern     value="\#[0-9a-fA-F]{6}|[a-zA-Z]+"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType      name="LayoutTypeSet">
    <xs:restriction   base="xs:string">
      <xs:enumeration value="keyboard"/>
      <xs:enumeration value="list"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Если мы сохраним новую схему в файле KeyEmFileSchema1.xsd потом KeyEmFileSchema.xml Файл может быть почти таким же, как у вас до:

<?xml version="1.0" encoding="utf-16"?>
<keyem xmlns="http://tempuri.org/KeyEmFileSchema.xsd"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xsi:schemaLocation="http://tempuri.org/KeyEmFileSchema.xsd KeyEmFileSchema1.xsd"
       description="test"
>
    <layout type="keyboard" height="300" width="300">
        <group text="rad 1">
            <key color="Black" macro="{ESC}10{ESC}43{MOUSERESET}" text="Ordi-\nnarie"/>
            <key color="Gray"  macro="{ESC}10{ESC}B0{MOUSERESET}" text="Släck\nskärm"/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2" icon="dfkhfkjsdhfkjdsf">
                <shift color="Blue"  macro="{ESC}1C{ESC}81{MOUSERESET}" text="Annan Skärm"/>
            </key>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
            <empty/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n4"/>
        </group>
        <group text="rad 2">
            <key color="Black" macro="{ESC}10{ESC}43{MOUSERESET}" text="Ordi-\nnarie"/>
            <key color="Gray"  macro="{ESC}10{ESC}B0{MOUSERESET}" text="Släck\nskärm"/>
            <group color ="Blue" text="test">
                <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
                <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2"/>
                <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
            </group>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n1"/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n2"/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n3"/>
            <empty/>
            <key color="Gray"  macro="{ESC}1B{ESC}81{MOUSERESET}" text="Skärm\n4"/>
        </group>

</layout>
</keyem>

Другие советы

Согласно вашей схеме, у вас есть неправильный узел внутри вашего XML:

<groupp text="rad 1">

Просто группа или элемент ключей могут быть вставлены на этот уровень.

Что касается вашей конкретной проблемы, попробуйте использовать следующий корневой узел внутри вашего файла схемы:

<xs:schema id="FileSchema"
    elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
...
</xs:schema>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top