XMLを多用し、経験を積み重ねる開発者として、以前はスキーマと実際にやりとりしたことはありません。これは初めて実際に私のために起こっています。XSDでXML文書を正しく検証する
私はよく機能しているバグの多くを考慮した「機能」を実行しました。
XDocument.Validate()を使用すると、指定したスキーマと一致しないドキュメントが有効になることがあります。私はこれがXSD、XML名前空間、および予想される検証プロセス間の関係についての私の理解の欠陥である可能性が最も高いと感じています。
したがって、XMLサンプル、XSDサンプル、および検証コードを送信します。
XML - これは意図的に間違ったドキュメントです。
<?xml version="1.0" encoding="utf-8" ?>
<SuppliesDefinitions
xmlns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Supplies.xsd">
<Supply type="Common">
<Information/>
<Ritual/>
<Weapon/>
<Tool count="1"/>
<Tool count="2"/>
<Tool count="3"/>
</Supply>
<Supply type="Uncommon">
<Information/>
<Weapon/>
<Tool count="1"/>
<Tool count="2"/>
<Tool count="3"/>
<Tool count="4"/>
</Supply>
<Supply type="Rare">
<Information/>
<Rune/>
<Weapon/>
<Tool count="2"/>
<Tool count="3"/>
<Tool count="4"/>
</Supply>
</SuppliesDefinitions>
これを検証するために使用されるXSD。 (これは意図的に上記XMLの意図しない文書です)
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Encounters"
targetNamespace="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
elementFormDefault="qualified"
xmlns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
xmlns:mstns="http://lavendersoftware.org/schemas/SteamGame/Data/Xml/Encounters.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="ToolType">
<xs:attribute name="count" use="required" type="xs:int"/>
</xs:complexType>
<xs:complexType name="TaskType">
<xs:choice maxOccurs="unbounded" minOccurs="1">
<xs:element name="Weapon"/>
<xs:element name="Information"/>
<xs:element name="Tool" type="ToolType"/>
<xs:element name="Ritual"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="EncounterType">
<xs:sequence maxOccurs="unbounded" minOccurs="1">
<xs:element name="Task" type="TaskType"/>
</xs:sequence>
<xs:attribute name="name" use="required" type="xs:string"/>
</xs:complexType>
<xs:element name="EncounterDefinitions">
<xs:complexType>
<xs:sequence maxOccurs="unbounded" minOccurs="1">
<xs:element name="Encounter" type="EncounterType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
最後に検証コードです。
private static void ValidateDocument(XDocument doc)
{
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(null, XmlReader.Create(new StreamReader(XmlSchemaProvider.GetSchemaStream("Encounters.xsd"))));
doc.Validate(schemas, (o, e) =>
{
//This is never hit!
Console.WriteLine("{0}", e.Message);
Assert.False(e.Severity == XmlSeverityType.Error);
});
}
誰かが私が間違っていることを説明できるかどうか疑問に思っていました。私は、このSHOULDが動作する方法についていくつか誤った仮定をしているように感じています。完全に無関係なXML文書に対してxsdを1つ使用すると無効と思われます。
Xsd検証では、通常、目的のスキーマが見つからない場合にのみ警告が生成されます。あなたはエラーのみをチェックしています。 –
これはここでは当てはまりません。XDocument.Validateの詳細については、http://msdn.microsoft.com/en-us/library/bb354954(v=vs.90).aspxを参照してください。この特定のバリデーションのオーバーロードは、エラーと警告を捕捉します。 –