385 lines
8.0 KiB
C#
385 lines
8.0 KiB
C#
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining
|
|
// a copy of this software and associated documentation files (the
|
|
// "Software"), to deal in the Software without restriction, including
|
|
// without limitation the rights to use, copy, modify, merge, publish,
|
|
// distribute, sublicense, and/or sell copies of the Software, and to
|
|
// permit persons to whom the Software is furnished to do so, subject to
|
|
// the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be
|
|
// included in all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
//
|
|
using System;
|
|
using System.Xml;
|
|
|
|
namespace System.Xml.Schema
|
|
{
|
|
/// <summary>
|
|
/// A wrapper around XmlReader
|
|
/// </summary>
|
|
internal class XmlSchemaReader : XmlReader, IXmlLineInfo
|
|
{
|
|
XmlReader reader;
|
|
ValidationEventHandler handler;
|
|
bool hasLineInfo;
|
|
public XmlSchemaReader(XmlReader reader,ValidationEventHandler handler)
|
|
{
|
|
this.reader = reader;
|
|
this.handler = handler;
|
|
if(reader is IXmlLineInfo)
|
|
{
|
|
IXmlLineInfo info = (IXmlLineInfo)reader;
|
|
hasLineInfo = info.HasLineInfo();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the Namespace:LocalName for the object
|
|
/// </summary>
|
|
public string FullName
|
|
{
|
|
get { return NamespaceURI + ":" + LocalName; }
|
|
}
|
|
|
|
public XmlReader Reader
|
|
{
|
|
get { return this.reader; }
|
|
}
|
|
|
|
public void RaiseInvalidElementError()
|
|
{
|
|
string errstr = "Element "+FullName + " is invalid in this context.\n";
|
|
if(hasLineInfo)
|
|
errstr += "The error occured on ("+((IXmlLineInfo)reader).LineNumber
|
|
+","+((IXmlLineInfo)reader).LinePosition+")";
|
|
XmlSchemaObject.error(handler, errstr, null);
|
|
SkipToEnd();
|
|
}
|
|
/// <summary>
|
|
/// Reads till the next Element or EndElement. Also checks that the Namespace of the element is
|
|
/// Schema's Namespace.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public bool ReadNextElement()
|
|
{
|
|
MoveToElement();
|
|
while(Read())
|
|
{
|
|
if(NodeType == XmlNodeType.Element || NodeType == XmlNodeType.EndElement)
|
|
{
|
|
if(reader.NamespaceURI != XmlSchema.Namespace)
|
|
{
|
|
RaiseInvalidElementError();
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Skips to the end of the current element
|
|
/// </summary>
|
|
public void SkipToEnd()
|
|
{
|
|
MoveToElement();
|
|
if(IsEmptyElement || NodeType != XmlNodeType.Element)
|
|
return;
|
|
if(NodeType == XmlNodeType.Element)
|
|
{
|
|
int depth = Depth;
|
|
while(Read())
|
|
{
|
|
if(Depth == depth)
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
#region LineInfo
|
|
public bool HasLineInfo()
|
|
{
|
|
return hasLineInfo;
|
|
}
|
|
public int LineNumber
|
|
{
|
|
get { return hasLineInfo?((IXmlLineInfo)reader).LineNumber: 0; }
|
|
}
|
|
public int LinePosition
|
|
{
|
|
get { return hasLineInfo?((IXmlLineInfo)reader).LinePosition: 0; }
|
|
}
|
|
#endregion
|
|
|
|
#region Delegates
|
|
public override int AttributeCount
|
|
{
|
|
get { return reader.AttributeCount; }
|
|
}
|
|
public override string BaseURI
|
|
{
|
|
get { return reader.BaseURI; }
|
|
}
|
|
public override bool CanResolveEntity
|
|
{
|
|
get { return reader.CanResolveEntity; }
|
|
}
|
|
public override int Depth
|
|
{
|
|
get { return reader.Depth; }
|
|
}
|
|
public override bool EOF
|
|
{
|
|
get { return reader.EOF; }
|
|
}
|
|
public override bool HasAttributes
|
|
{
|
|
get { return reader.HasAttributes; }
|
|
}
|
|
public override bool HasValue
|
|
{
|
|
get { return reader.HasValue; }
|
|
}
|
|
public override bool IsDefault
|
|
{
|
|
get { return reader.IsDefault; }
|
|
}
|
|
public override bool IsEmptyElement
|
|
{
|
|
get { return reader.IsEmptyElement; }
|
|
}
|
|
public override string this[ int i ]
|
|
{
|
|
get { return reader[i]; }
|
|
}
|
|
public override string this[ string name ]
|
|
{
|
|
get { return reader[name]; }
|
|
}
|
|
public override string this[ string name, string namespaceURI ]
|
|
{
|
|
get { return reader[name,namespaceURI]; }
|
|
}
|
|
public override string LocalName
|
|
{
|
|
get { return reader.LocalName; }
|
|
}
|
|
public override string Name
|
|
{
|
|
get { return reader.Name; }
|
|
}
|
|
public override string NamespaceURI
|
|
{
|
|
get { return reader.NamespaceURI; }
|
|
}
|
|
public override XmlNameTable NameTable
|
|
{
|
|
get { return reader.NameTable; }
|
|
}
|
|
public override XmlNodeType NodeType
|
|
{
|
|
get { return reader.NodeType; }
|
|
}
|
|
public override string Prefix
|
|
{
|
|
get { return reader.Prefix; }
|
|
}
|
|
public override char QuoteChar
|
|
{
|
|
get { return reader.QuoteChar; }
|
|
}
|
|
public override ReadState ReadState
|
|
{
|
|
get { return reader.ReadState; }
|
|
}
|
|
public override string Value
|
|
{
|
|
get { return reader.Value; }
|
|
}
|
|
public override string XmlLang
|
|
{
|
|
get { return reader.XmlLang; }
|
|
}
|
|
public override XmlSpace XmlSpace
|
|
{
|
|
get { return reader.XmlSpace; }
|
|
}
|
|
|
|
public override void Close()
|
|
{
|
|
reader.Close();
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
return reader.Equals(obj);
|
|
}
|
|
|
|
public override string GetAttribute(int i)
|
|
{
|
|
return reader.GetAttribute(i);
|
|
}
|
|
|
|
public override string GetAttribute(string name)
|
|
{
|
|
return reader.GetAttribute(name);
|
|
}
|
|
|
|
public override string GetAttribute(string name, string namespaceURI)
|
|
{
|
|
return reader.GetAttribute(name, namespaceURI);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return reader.GetHashCode();
|
|
}
|
|
|
|
public override bool IsStartElement()
|
|
{
|
|
return reader.IsStartElement();
|
|
}
|
|
|
|
public override bool IsStartElement(string localname, string ns)
|
|
{
|
|
return reader.IsStartElement(localname, ns);
|
|
}
|
|
|
|
public override bool IsStartElement(string name)
|
|
{
|
|
return reader.IsStartElement(name);
|
|
}
|
|
|
|
public override string LookupNamespace(string prefix)
|
|
{
|
|
return reader.LookupNamespace(prefix);
|
|
}
|
|
|
|
public override void MoveToAttribute(int i)
|
|
{
|
|
reader.MoveToAttribute(i);
|
|
}
|
|
|
|
public override bool MoveToAttribute(string name)
|
|
{
|
|
return reader.MoveToAttribute(name);
|
|
}
|
|
|
|
public override bool MoveToAttribute(string name, string ns)
|
|
{
|
|
return reader.MoveToAttribute(name,ns);
|
|
}
|
|
|
|
public override System.Xml.XmlNodeType MoveToContent()
|
|
{
|
|
return reader.MoveToContent();
|
|
}
|
|
|
|
public override bool MoveToElement()
|
|
{
|
|
return reader.MoveToElement();
|
|
}
|
|
|
|
public override bool MoveToFirstAttribute()
|
|
{
|
|
return reader.MoveToFirstAttribute();
|
|
}
|
|
|
|
public override bool MoveToNextAttribute()
|
|
{
|
|
return reader.MoveToNextAttribute();
|
|
}
|
|
|
|
public override bool Read()
|
|
{
|
|
return reader.Read();
|
|
}
|
|
|
|
public override bool ReadAttributeValue()
|
|
{
|
|
return reader.ReadAttributeValue();
|
|
}
|
|
|
|
public override string ReadElementString()
|
|
{
|
|
return reader.ReadElementString();
|
|
}
|
|
|
|
public override string ReadElementString(string localname, string ns)
|
|
{
|
|
return reader.ReadElementString(localname, ns);
|
|
}
|
|
|
|
public override string ReadElementString(string name)
|
|
{
|
|
return reader.ReadElementString(name);
|
|
}
|
|
|
|
public override void ReadEndElement()
|
|
{
|
|
reader.ReadEndElement();
|
|
}
|
|
|
|
public override string ReadInnerXml()
|
|
{
|
|
return reader.ReadInnerXml();
|
|
}
|
|
|
|
public override string ReadOuterXml()
|
|
{
|
|
return reader.ReadOuterXml();
|
|
}
|
|
|
|
public override void ReadStartElement()
|
|
{
|
|
reader.ReadStartElement();
|
|
}
|
|
|
|
public override void ReadStartElement(string localname, string ns)
|
|
{
|
|
reader.ReadStartElement(localname, ns);
|
|
}
|
|
|
|
public override void ReadStartElement(string name)
|
|
{
|
|
reader.ReadStartElement(name);
|
|
}
|
|
|
|
public override string ReadString()
|
|
{
|
|
return reader.ReadString();
|
|
}
|
|
|
|
public override void ResolveEntity()
|
|
{
|
|
reader.ResolveEntity();
|
|
}
|
|
|
|
public override void Skip()
|
|
{
|
|
reader.Skip();
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return reader.ToString();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|