2009-12-09 Jb Evain <jbevain@novell.com>
[mcs.git] / tools / mono-xmltool / xmltool.cs
blob918e4a2d48d3cf4a113bfa63f40b3ee904f0dad7
1 using System;
2 using System.IO;
3 using System.Text;
4 using System.Xml;
5 using System.Xml.Schema;
6 using System.Xml.Xsl;
7 using System.Xml.XPath;
8 #if !TARGET_JVM && !MSNET
9 using Commons.Xml.Nvdl;
10 using Commons.Xml.Relaxng;
11 using Commons.Xml.Relaxng.Rnc;
12 #endif
13 using XSchema = System.Xml.Schema.XmlSchema;
15 namespace Commons.Xml.Relaxng
17 public class Driver
19 public static void Main (string [] args)
21 try {
22 Run (args);
23 } catch (Exception ex) {
24 if (Environment.GetEnvironmentVariable ("MONO_XMLTOOL_ERROR_DETAILS") == "yes")
25 Console.Error.WriteLine (ex);
26 else
27 Console.Error.WriteLine (ex.Message);
31 static void Usage ()
33 Console.Error.WriteLine (@"
34 Usage: mono-xmltool [options]
36 options:
38 --validate [*.rng | *.rnc | *.nvdl | *.xsd] [instances]
39 --validate-rng relax-ng-grammar-xml [instances]
40 --validate-rnc relax-ng-compact-grammar-file [instances]
41 --validate-nvdl nvdl-script-xml [instances]
42 --validate-xsd xml-schema [instances]
43 --validate-xsd2 xml-schema [instances] (in .NET 2.0 validator)
44 --validate-dtd instances
45 --transform stylesheet instance-xml [output-xml]
46 --prettyprint [source] [result]
48 environment variable that affects behavior:
50 MONO_XMLTOOL_ERROR_DETAILS = yes : to get exception details.
51 ");
54 static void Run (string [] args)
56 if (args.Length == 0) {
57 Usage ();
58 return;
61 switch (args [0]) {
62 default:
63 case "--help":
64 Usage ();
65 return;
66 #if !TARGET_JVM && !MSNET
67 case "--validate":
68 ValidateAuto (args);
69 return;
70 case "--validate-rnc":
71 ValidateRelaxngCompact (args);
72 return;
73 case "--validate-rng":
74 ValidateRelaxngXml (args);
75 return;
76 case "--validate-nvdl":
77 ValidateNvdl (args);
78 return;
79 #endif
80 case "--validate-xsd2":
81 ValidateXsd2 (args);
82 return;
83 case "--validate-xsd":
84 ValidateXsd (args);
85 return;
86 case "--validate-dtd":
87 ValidateDtd (args);
88 return;
89 case "--transform":
90 Transform (args);
91 return;
92 case "--prettyprint":
93 PrettyPrint (args);
94 return;
98 #if !TARGET_JVM && !MSNET
99 static void ValidateAuto (string [] args)
101 if (args.Length < 1) {
102 Usage ();
103 return;
106 if (args [1].EndsWith ("rng"))
107 ValidateRelaxngXml (args);
108 else if (args [1].EndsWith ("rnc"))
109 ValidateRelaxngCompact (args);
110 else if (args [1].EndsWith ("nvdl"))
111 ValidateNvdl (args);
112 else if (args [1].EndsWith ("xsd"))
113 ValidateXsd (args);
116 static void ValidateRelaxngXml (string [] args)
118 XmlReader xr = new XmlTextReader (args [1]);
119 RelaxngPattern p = RelaxngPattern.Read (xr);
120 xr.Close ();
121 ValidateRelaxng (p, args);
124 static void ValidateRelaxngCompact (string [] args)
126 StreamReader sr = new StreamReader (args [1]);
127 RelaxngPattern p = RncParser.ParseRnc (sr, null, Path.GetFullPath (args [1]));
128 sr.Close ();
129 ValidateRelaxng (p, args);
132 static void ValidateRelaxng (RelaxngPattern p, string [] args)
134 p.Compile ();
136 if (args.Length < 2)
137 return;
139 for (int i = 2; i < args.Length; i++) {
140 XmlTextReader xtr = new XmlTextReader (args [i]);
141 RelaxngValidatingReader vr =
142 new RelaxngValidatingReader (xtr, p);
143 if (Environment.GetEnvironmentVariable ("MONO_XMLTOOL_ERROR_DETAILS") == "yes")
144 vr.ReportDetails = true;
145 else
146 vr.InvalidNodeFound += delegate (XmlReader source, string message) {
147 IXmlLineInfo li = source as IXmlLineInfo;
148 Console.WriteLine ("ERROR: {0} (at {1} line {2} column {3})",
149 message,
150 source.BaseURI,
151 li != null && li.HasLineInfo () ? li.LineNumber : 0,
152 li != null && li.HasLineInfo () ? li.LinePosition : 0);
153 return true;
156 while (!vr.EOF)
157 vr.Read ();
161 static void ValidateNvdl (string [] args)
163 XmlTextReader nvdlxtr = new XmlTextReader (args [1]);
164 NvdlRules nvdl = NvdlReader.Read (nvdlxtr);
165 nvdlxtr.Close ();
166 for (int i = 2; i < args.Length; i++) {
167 XmlTextReader xtr = new XmlTextReader (args [i]);
168 NvdlValidatingReader nvr = new NvdlValidatingReader (xtr, nvdl);
169 while (!nvr.EOF)
170 nvr.Read ();
171 xtr.Close ();
174 #endif
176 static void ValidateXsd (string [] args)
178 XmlTextReader schemaxml = new XmlTextReader (args [1]);
179 XSchema xsd = XSchema.Read (schemaxml, null);
180 schemaxml.Close ();
181 xsd.Compile (null);
182 for (int i = 2; i < args.Length; i++) {
183 XmlTextReader xtr = new XmlTextReader (args [i]);
184 XmlValidatingReader xvr = new XmlValidatingReader (xtr);
185 xvr.Schemas.Add (xsd);
186 while (!xvr.EOF)
187 xvr.Read ();
188 xvr.Close ();
192 static void ValidateXsd2 (string [] args)
194 XmlReaderSettings s = new XmlReaderSettings ();
195 s.ValidationType = ValidationType.Schema;
196 s.Schemas.Add (null, args [1]);
197 for (int i = 2; i < args.Length; i++) {
198 XmlReader xr = XmlReader.Create (args [i], s);
199 while (!xr.EOF)
200 xr.Read ();
201 xr.Close ();
205 static void ValidateDtd (string [] args)
207 for (int i = 1; i < args.Length; i++) {
208 XmlValidatingReader xvr = new XmlValidatingReader (
209 new XmlTextReader (args [i]));
210 xvr.ValidationType = ValidationType.DTD;
211 xvr.EntityHandling = EntityHandling.ExpandEntities;
212 while (!xvr.EOF)
213 xvr.Read ();
214 xvr.Close ();
218 static void Transform (string [] args)
220 XslTransform t = new XslTransform ();
221 t.Load (args [1]);
222 TextWriter output = args.Length > 3 ?
223 File.CreateText (args [3]) : Console.Out;
224 t.Transform (new XPathDocument (args [2], XmlSpace.Preserve), null, output, null);
225 output.Close ();
228 static void PrettyPrint (string [] args)
230 XmlTextReader r = null;
231 if (args.Length > 1)
232 r = new XmlTextReader (args [1]);
233 else
234 r = new XmlTextReader (Console.In);
235 r.WhitespaceHandling = WhitespaceHandling.Significant;
236 XmlTextWriter w = null;
237 if (args.Length > 2)
238 w = new XmlTextWriter (args [1], Encoding.UTF8);
239 else
240 w = new XmlTextWriter (Console.Out);
241 w.Formatting = Formatting.Indented;
243 r.Read ();
244 while (!r.EOF)
245 w.WriteNode (r, false);
246 r.Close ();
247 w.Close ();