Ошибка при проверке файла XML с XSD
-
26-09-2019 - |
Вопрос
Я пытаюсь проверить файл 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-файле:
- Использование необъявленного атрибута
description
вkeyem
элемент. - Использование всех атрибутов в
layout
элемент, который также не пренебрежен. - Использование
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>