1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System.Configuration.Internal; 6 using System.IO; 7 using System.Xml; 8 9 namespace System.Configuration 10 { 11 // ConfigXmlDocument - the default Xml Document doesn't track line numbers, and line 12 // numbers are necessary to display source on config errors. 13 // These classes wrap corresponding System.Xml types and also carry 14 // the necessary information for reporting filename / line numbers. 15 // Note: these classes will go away if webdata ever decides to incorporate line numbers 16 // into the default XML classes. This class could also go away if webdata brings back 17 // the UserData property to hang any info off of any node. 18 public sealed class ConfigXmlDocument : XmlDocument, IConfigErrorInfo 19 { 20 XmlTextReader _reader; 21 int _lineOffset; 22 string _filename; 23 24 int IConfigErrorInfo.LineNumber 25 { 26 get 27 { 28 if (_reader == null) 29 { 30 return 0; 31 } 32 33 if (_lineOffset > 0) 34 { 35 return _reader.LineNumber + _lineOffset - 1; 36 } 37 38 return _reader.LineNumber; 39 } 40 } 41 42 public int LineNumber { get { return ((IConfigErrorInfo)this).LineNumber; } } 43 44 public string Filename 45 { 46 get { return _filename; } 47 } 48 49 string IConfigErrorInfo.Filename 50 { 51 get { return _filename; } 52 } 53 Load(string filename)54 public override void Load(string filename) 55 { 56 _filename = filename; 57 try 58 { 59 _reader = new XmlTextReader(filename); 60 _reader.XmlResolver = null; 61 base.Load(_reader); 62 } 63 finally 64 { 65 if (_reader != null) 66 { 67 _reader.Close(); 68 _reader = null; 69 } 70 } 71 } 72 LoadSingleElement(string filename, XmlTextReader sourceReader)73 public void LoadSingleElement(string filename, XmlTextReader sourceReader) 74 { 75 _filename = filename; 76 _lineOffset = sourceReader.LineNumber; 77 string outerXml = sourceReader.ReadOuterXml(); 78 79 try 80 { 81 _reader = new XmlTextReader(new StringReader(outerXml), sourceReader.NameTable); 82 base.Load(_reader); 83 } 84 finally 85 { 86 if (_reader != null) 87 { 88 _reader.Close(); 89 _reader = null; 90 } 91 } 92 } 93 CreateAttribute(string prefix, string localName, string namespaceUri)94 public override XmlAttribute CreateAttribute(string prefix, string localName, string namespaceUri) 95 { 96 return new ConfigXmlAttribute(_filename, LineNumber, prefix, localName, namespaceUri, this); 97 } 98 CreateElement(string prefix, string localName, string namespaceUri)99 public override XmlElement CreateElement(string prefix, string localName, string namespaceUri) 100 { 101 return new ConfigXmlElement(_filename, LineNumber, prefix, localName, namespaceUri, this); 102 } 103 CreateTextNode(string text)104 public override XmlText CreateTextNode(string text) 105 { 106 return new ConfigXmlText(_filename, LineNumber, text, this); 107 } 108 CreateCDataSection(String data)109 public override XmlCDataSection CreateCDataSection(String data) 110 { 111 return new ConfigXmlCDataSection(_filename, LineNumber, data, this); 112 } 113 CreateComment(String data)114 public override XmlComment CreateComment(String data) 115 { 116 return new ConfigXmlComment(_filename, LineNumber, data, this); 117 } 118 CreateSignificantWhitespace(String data)119 public override XmlSignificantWhitespace CreateSignificantWhitespace(String data) 120 { 121 return new ConfigXmlSignificantWhitespace(_filename, LineNumber, data, this); 122 } 123 CreateWhitespace(String data)124 public override XmlWhitespace CreateWhitespace(String data) 125 { 126 return new ConfigXmlWhitespace(_filename, LineNumber, data, this); 127 } 128 } 129 } 130