C#でXsdファイルを作成しています。これは本当にうまくいきます。Xml スキーマ内で独自の単純型を定義しますが、次のことが起こっています。
期待される:
<xs:element name="name2" type="str32" />
実際:
<xs:element name="name2" type="xs:str32" />
ご覧のとおり、タイプを定義する「xs:」が含まれています。xs: を削除すると、Xsd が有効になります。
これが私の単純な型定義です:
<xs:simpleType name="str32">
<xs:restriction base="xs:string">
<xs:maxLength value="32" />
</xs:restriction>
</xs:simpleType>
最後になりましたが、C# コードは次のとおりです。
http://www.mediafire.com/download/fud0xown8nzauyx/DbToXsdConverter.cs
結論として、タイプ名の前にある xs: を削除したいのですが、自動的に追加されます。この型名だけで、どこでも名前空間を削除したくありません。
編集: Xml スキーマをファイルに書き込むコードは次のとおりです。
public class XsdWriter
{
public static void saveFile(String file, XmlSchema schema)
{
using (XmlTextWriter writer = CreateWriter(file))
{
XmlNamespaceManager namespaceManager = CreateNamespaceManager();
schema.Write(writer, namespaceManager);
}
//TODO
String tempFile = "temp_" + file;
File.Delete(tempFile);
File.Move(file, tempFile);
using (StreamReader reader = new StreamReader(tempFile))
{
using(StreamWriter writer = new StreamWriter(file))
{
String line = "";
while((line = reader.ReadLine()) != null)
{
line = line.Replace("type=\"xs:str", "type=\"str");
writer.WriteLine(line);
}
}
}
File.Delete(tempFile);
}
private static XmlTextWriter CreateWriter(String file)
{
XmlTextWriter writer = new XmlTextWriter(file, new UTF8Encoding());
writer.Formatting = Formatting.Indented;
return writer;
}
private static XmlNamespaceManager CreateNamespaceManager()
{
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());
namespaceManager.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema");
return namespaceManager;
}
}
編集:解決済み、単純なカスタム型を使用する場合、XmlQualifiedName から名前空間を削除する必要がありました。