Stream ベースのオーバーロードを使用して XML スキーマを読み取る際の問題は、XML スキーマ リーダーで使用できるベース URI がないことです。xsd:redefine が schemaLocation 属性で相対 URI を使用している場合、デフォルトのリゾルバーは再定義されているスキーマを見つけることができないため、エラー メッセージが表示されます。
少なくともこれがどのように機能するかを理解するために、次の構成を提供しています。2 つのスキーマとテスト スクリプトを同じフォルダーに保存し、スクリプト内のパスを更新して、C# スクリプトを実行します。次の出力が得られます。
QN: http://tempuri.org/XMLSchema.xsd:TRedefine, SourceUri: file:///D:/.../.../Redefine.xsd
QN: http://www.w3.org/2001/XMLSchema:anyType, SourceUri:
Stream ベースのオーバーロードを使用するようにスクリプトを更新すると、投稿からエラー メッセージが表示されます。
Error line 20: xset.Add(XmlSchema.Read(File.Open (@"D:\...\...\Redefine.xsd", FileMode.Open), null));
'SchemaLocation' must successfully resolve if <redefine> contains any child other than <annotation>.
'SchemaLocation' must successfully resolve if <redefine> contains any child other than <annotation>.
Error Line 21: xset.Add(XmlSchema.Read(File.Open (@"D:\...\...\Redefine.xsd", FileMode.Open), null));
基本スキーマ:
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchema.xsd"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="TRedefine">
<xsd:sequence>
<xsd:element name="base" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
以下を再定義するスキーマ:
<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XSR Module (http://www.paschidev.com)-->
<xsd:schema xmlns="http://tempuri.org/XMLSchema.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!-- Put a full path here.
<xsd:redefine schemaLocation="D:\...\...\Base.xsd">
-->
<xsd:redefine schemaLocation="Base.xsd">
<xsd:complexType name="TRedefine">
<xsd:complexContent>
<xsd:extension base="TRedefine">
<xsd:sequence/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:redefine>
</xsd:schema>
テスト スクリプト:
using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
class Script
{
public static void Main()
{
// Enter your code below
// Generated by QTAssistant (http://www.paschidev.com)
XmlSchemaSet xset = new XmlSchemaSet();
// One way of doing using an XmlReader - it'll work with relative URIs.
using(XmlReader reader = XmlReader.Create(@"D:\...\...\Redefine.xsd"))
{
xset.Add(XmlSchema.Read(reader, null));
}
// The other way, using stream, requires all external URIs - xsd:include, xsd:import and xsd:redefine
// to be absolute
//xset.Add(XmlSchema.Read(File.Open(@"D:\...\...\Redefine.xsd", FileMode.Open), null));
xset.Compile();
Console.WriteLine(xset.IsCompiled);
foreach(XmlSchemaType type in xset.GlobalTypes.Values)
{
Console.WriteLine("QN: {0}, SourceUri: {1}", type.QualifiedName, type.SourceUri);
}
}
}