Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

68 lines
1.5 KiB
C#

using System;
using System.IO;
using System.Reflection;
using System.Xml;
using System.Xml.Schema;
using BF = System.Reflection.BindingFlags;
class Dtd2XsdDriver
{
public static void Main (string [] args)
{
try {
Run (args);
} catch (Exception ex) {
Console.WriteLine ("ERROR: " + ex.Message);
}
}
static void Run (string [] args)
{
if (args.Length < 1) {
Console.WriteLine ("USAGE: mono dtd2xsd.exe instance-xmlfile [output-xsdfile]");
return;
}
XmlTextReader xtr;
if (args [0].EndsWith (".dtd"))
xtr = new XmlTextReader ("<!DOCTYPE dummy SYSTEM '" + args [0] + "'><dummy/>",
XmlNodeType.Document, null);
else
xtr = new XmlTextReader (args [0]);
XmlSchema xsd = Dtd2Xsd.Run (xtr);
if (args.Length > 1)
xsd.Write (new StreamWriter (args [1]));
else
xsd.Write (Console.Out);
}
}
public class Dtd2Xsd
{
public static XmlSchema Run (XmlTextReader xtr)
{
while (xtr.NodeType != XmlNodeType.DocumentType) {
if (!xtr.Read ())
throw new Exception ("DTD did not appeare.");
}
// Hacky reflection part
object impl = xtr;
BF flag = BF.NonPublic | BF.Instance;
// In Mono NET_2_0 XmlTextReader is just a wrapper which
// does not contain DTD directly.
FieldInfo fi = typeof (XmlTextReader).GetField ("source", flag);
if (fi != null)
impl = fi.GetValue (xtr);
PropertyInfo pi = impl.GetType ().GetProperty ("DTD", flag);
object dtd = pi.GetValue (impl, null);
MethodInfo mi =
dtd.GetType ().GetMethod ("CreateXsdSchema", flag);
object o = mi.Invoke (dtd, null);
return (XmlSchema) o;
}
}