Update of /cvsroot/mvp-xml/XPointer/v2/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25660/v2/src Modified Files: ElementSchemaPointerPart.cs IDAssuredValidatingReader.cs LexUtils.cs Pointer.cs PointerPart.cs SR.cs SchemaBasedPointer.cs ShorthandPointer.cs XPath1SchemaPointerPart.cs XPointer.csproj XPointerException.cs XPointerLexer.cs XPointerParser.cs XPointerReader.cs XPointerSchema.cs XPointerSchemaPointerPart.cs XmlnsSchemaPointerPart.cs Log Message: Index: IDAssuredValidatingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/IDAssuredValidatingReader.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- IDAssuredValidatingReader.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ IDAssuredValidatingReader.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -4,92 +4,92 @@ #endregion -namespace Mvp.Xml.XPointer +namespace Mvp.Xml.XPointer { + /// <summary> + /// Auxillary XmlReader that always reports dummy DOCTYPE. This is done + /// to turn on support for id() function in XML Schema defined XML documents. + /// See http://www.tkachenko.com/blog/archives/000060.html. + /// </summary> + internal class IdAssuredValidatingReader : XmlValidatingReader + { + #region private members + + private bool _exposeDummyDoctype; + private bool _isInProlog = true; + + #endregion + + #region constructors + /// <summary> - /// Auxillary XmlReader that always reports dummy DOCTYPE. This is done - /// to turn on support for id() function in XML Schema defined XML documents. - /// See http://www.tkachenko.com/blog/archives/000060.html. + /// Constructs <c>IdAssuredValidatingReader</c> on top of another reader. /// </summary> - internal class IdAssuredValidatingReader : XmlValidatingReader - { - #region private members + /// <param name="r"></param> + public IdAssuredValidatingReader(XmlReader r) : base(r) { } - private bool _exposeDummyDoctype; - private bool _isInProlog = true; + #endregion - #endregion + #region XmlValidatingReader overrides - #region constructors - - /// <summary> - /// Constructs <c>IdAssuredValidatingReader</c> on top of another reader. - /// </summary> - /// <param name="r"></param> - public IdAssuredValidatingReader(XmlReader r) : base (r) {} + /// <summary>See <see cref="XmlValidatingReader.NodeType"/>.</summary> + public override XmlNodeType NodeType + { + get + { + return _exposeDummyDoctype ? + XmlNodeType.DocumentType : + base.NodeType; + } + } - #endregion + /// <summary>See <see cref="XmlValidatingReader.MoveToNextAttribute"/>.</summary> + public override bool MoveToNextAttribute() + { + return _exposeDummyDoctype ? + false : + base.MoveToNextAttribute(); + } - #region XmlValidatingReader overrides - - /// <summary>See <see cref="XmlValidatingReader.NodeType"/>.</summary> - public override XmlNodeType NodeType - { - get - { - return _exposeDummyDoctype ? - XmlNodeType.DocumentType : - base.NodeType; - } - } - - /// <summary>See <see cref="XmlValidatingReader.MoveToNextAttribute"/>.</summary> - public override bool MoveToNextAttribute() + /// <summary>See <see cref="XmlValidatingReader.Read"/>.</summary> + public override bool Read() + { + if (_isInProlog) + { + if (!_exposeDummyDoctype) { - return _exposeDummyDoctype? - false : - base.MoveToNextAttribute(); + //We are looking for the very first element + bool baseRead = base.Read(); + if (base.NodeType == XmlNodeType.Element) + { + _exposeDummyDoctype = true; + return true; + } + else if (base.NodeType == XmlNodeType.DocumentType) + { + //Document has own DOCTYPE, switch back to normal flow + _exposeDummyDoctype = false; + _isInProlog = false; + return true; + } + else + { + return baseRead; + } } - - /// <summary>See <see cref="XmlValidatingReader.Read"/>.</summary> - public override bool Read() + else { - if (_isInProlog) - { - if (!_exposeDummyDoctype) - { - //We are looking for the very first element - bool baseRead = base.Read(); - if (base.NodeType == XmlNodeType.Element) - { - _exposeDummyDoctype = true; - return true; - } - else if (base.NodeType == XmlNodeType.DocumentType) - { - //Document has own DOCTYPE, switch back to normal flow - _exposeDummyDoctype = false; - _isInProlog = false; - return true; - } - else - { - return baseRead; - } - } - else - { - //Done, switch back to normal flow - _exposeDummyDoctype = false; - _isInProlog = false; - return true; - } - } - else - return base.Read(); + //Done, switch back to normal flow + _exposeDummyDoctype = false; + _isInProlog = false; + return true; } - - #endregion + } + else + return base.Read(); } + + #endregion + } } \ No newline at end of file Index: Pointer.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/Pointer.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Pointer.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ Pointer.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -6,35 +6,36 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// Abstract XPointer pointer. - /// </summary> - public abstract class Pointer { +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// Abstract XPointer pointer. + /// </summary> + public abstract class Pointer + { - #region public methods + #region public methods - /// <summary> - /// Parses XPointer pointer and compiles it into - /// an instance of <see cref="Pointer"/> class. - /// </summary> - /// <param name="xpointer">XPointer pointer</param> - /// <returns>Parsed and compiled XPointer</returns> - public static Pointer Compile(string xpointer) - { - return XPointerParser.ParseXPointer(xpointer); - } + /// <summary> + /// Parses XPointer pointer and compiles it into + /// an instance of <see cref="Pointer"/> class. + /// </summary> + /// <param name="xpointer">XPointer pointer</param> + /// <returns>Parsed and compiled XPointer</returns> + public static Pointer Compile(string xpointer) + { + return XPointerParser.ParseXPointer(xpointer); + } - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer and returns - /// iterator over pointed nodes. - /// </summary> - /// <param name="nav">Navigator to evaluate the - /// <see cref="XPointer"/> on.</param> - /// <returns><see cref="XPathNodeIterator"/> over pointed nodes. Note - this iterator is moved to the first node already.</returns> - public abstract XPathNodeIterator Evaluate(XPathNavigator nav); + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer and returns + /// iterator over pointed nodes. + /// </summary> + /// <param name="nav">Navigator to evaluate the + /// <see cref="XPointer"/> on.</param> + /// <returns><see cref="XPathNodeIterator"/> over pointed nodes. Note - this iterator is moved to the first node already.</returns> + public abstract XPathNodeIterator Evaluate(XPathNavigator nav); - #endregion - } + #endregion + } } Index: SchemaBasedPointer.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/SchemaBasedPointer.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- SchemaBasedPointer.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ SchemaBasedPointer.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -7,60 +7,60 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// SchemaBased XPointer pointer. - /// </summary> - internal class SchemaBasedPointer : Pointer - { +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// SchemaBased XPointer pointer. + /// </summary> + internal class SchemaBasedPointer : Pointer + { - #region private members + #region private members - private IList<PointerPart> _parts; - private string _xpointer; + private IList<PointerPart> _parts; + private string _xpointer; - #endregion + #endregion - #region constructors - - /// <summary> - /// Creates scheme based XPointer given list of pointer parts. - /// </summary> - /// <param name="parts">List of pointer parts</param> - /// <param name="xpointer">String representation of the XPointer - /// (for error diagnostics)</param> - public SchemaBasedPointer(IList<PointerPart> parts, string xpointer) - { - _parts = parts; - _xpointer = xpointer; - } + #region constructors - #endregion - - #region Pointer overrides + /// <summary> + /// Creates scheme based XPointer given list of pointer parts. + /// </summary> + /// <param name="parts">List of pointer parts</param> + /// <param name="xpointer">String representation of the XPointer + /// (for error diagnostics)</param> + public SchemaBasedPointer(IList<PointerPart> parts, string xpointer) + { + _parts = parts; + _xpointer = xpointer; + } - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer and returns - /// iterator over pointed nodes. - /// </summary> - /// <param name="nav">XPathNavigator to evaluate the - /// <see cref="XPointer"/> on.</param> - /// <returns><see cref="XPathNodeIterator"/> over pointed nodes</returns> - public override XPathNodeIterator Evaluate(XPathNavigator nav) - { - XPathNodeIterator result; - XmlNamespaceManager nm = new XmlNamespaceManager(nav.NameTable); - for (int i=0; i<_parts.Count; i++) - { - PointerPart part = _parts[i]; - result = part.Evaluate(nav, nm); - if (result != null && result.MoveNext()) - return result; - } - throw new NoSubresourcesIdentifiedException(SR.GetString("NoSubresourcesIdentifiedException", _xpointer)); - } + #endregion - #endregion + #region Pointer overrides + + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer and returns + /// iterator over pointed nodes. + /// </summary> + /// <param name="nav">XPathNavigator to evaluate the + /// <see cref="XPointer"/> on.</param> + /// <returns><see cref="XPathNodeIterator"/> over pointed nodes</returns> + public override XPathNodeIterator Evaluate(XPathNavigator nav) + { + XPathNodeIterator result; + XmlNamespaceManager nm = new XmlNamespaceManager(nav.NameTable); + for (int i = 0; i < _parts.Count; i++) + { + PointerPart part = _parts[i]; + result = part.Evaluate(nav, nm); + if (result != null && result.MoveNext()) + return result; + } + throw new NoSubresourcesIdentifiedException(SR.GetString("NoSubresourcesIdentifiedException", _xpointer)); } + + #endregion + } } Index: XmlnsSchemaPointerPart.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XmlnsSchemaPointerPart.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XmlnsSchemaPointerPart.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XmlnsSchemaPointerPart.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -1,4 +1,4 @@ -#region using +#region using using System; using System.Xml; @@ -6,85 +6,85 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// xmlns() scheme based <see cref="XPointer"/> pointer part. - /// </summary> - internal class XmlnsSchemaPointerPart : PointerPart - { +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// xmlns() scheme based <see cref="XPointer"/> pointer part. + /// </summary> + internal class XmlnsSchemaPointerPart : PointerPart + { - #region private members + #region private members - private string _prefix, _uri; + private string _prefix, _uri; - #endregion + #endregion - #region constructors + #region constructors - /// <summary> - /// Creates xmlns() scheme pointer part with given - /// namespace prefix and namespace URI. - /// </summary> - /// <param name="prefix">Namespace prefix</param> - /// <param name="uri">Namespace URI</param> - public XmlnsSchemaPointerPart(string prefix, string uri) - { - _prefix = prefix; - _uri = uri; - } + /// <summary> + /// Creates xmlns() scheme pointer part with given + /// namespace prefix and namespace URI. + /// </summary> + /// <param name="prefix">Namespace prefix</param> + /// <param name="uri">Namespace URI</param> + public XmlnsSchemaPointerPart(string prefix, string uri) + { + _prefix = prefix; + _uri = uri; + } - #endregion - - #region PointerPart overrides + #endregion - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. - /// </summary> - /// <param name="doc">Document to evaluate pointer part on</param> - /// <param name="nm">Namespace manager</param> - /// <returns>Pointed nodes</returns> - public override XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm) - { - nm.AddNamespace(_prefix, _uri); - return null; - } + #region PointerPart overrides - #endregion + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. + /// </summary> + /// <param name="doc">Document to evaluate pointer part on</param> + /// <param name="nm">Namespace manager</param> + /// <returns>Pointed nodes</returns> + public override XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm) + { + nm.AddNamespace(_prefix, _uri); + return null; + } - #region parser - - public static XmlnsSchemaPointerPart ParseSchemaData(XPointerLexer lexer) - { - //[1] XmlnsSchemeData ::= NCName S? '=' S? EscapedNamespaceName - //[2] EscapedNamespaceName ::= EscapedData* - //Read prefix as NCName - lexer.NextLexeme(); - if (lexer.Kind != XPointerLexer.LexKind.NCName) - { - Debug.WriteLine(SR.InvalidTokenInXmlnsSchemeWhileNCNameExpected); - return null; - } - string prefix = lexer.NCName; - lexer.SkipWhiteSpace(); - lexer.NextLexeme(); - if (lexer.Kind != XPointerLexer.LexKind.Eq) - { - Debug.WriteLine(SR.InvalidTokenInXmlnsSchemeWhileEqualsSignExpected); - return null; - } - lexer.SkipWhiteSpace(); - string nsURI; - try - { - nsURI = lexer.ParseEscapedData(); - } - catch (Exception e) - { - throw new XPointerSyntaxException(SR.GetString("SyntaxErrorInXmlnsSchemeData", e.Message)); - } - return new XmlnsSchemaPointerPart(prefix, nsURI); - } - #endregion + #endregion + + #region parser + + public static XmlnsSchemaPointerPart ParseSchemaData(XPointerLexer lexer) + { + //[1] XmlnsSchemeData ::= NCName S? '=' S? EscapedNamespaceName + //[2] EscapedNamespaceName ::= EscapedData* + //Read prefix as NCName + lexer.NextLexeme(); + if (lexer.Kind != XPointerLexer.LexKind.NCName) + { + Debug.WriteLine(SR.InvalidTokenInXmlnsSchemeWhileNCNameExpected); + return null; + } + string prefix = lexer.NCName; + lexer.SkipWhiteSpace(); + lexer.NextLexeme(); + if (lexer.Kind != XPointerLexer.LexKind.Eq) + { + Debug.WriteLine(SR.InvalidTokenInXmlnsSchemeWhileEqualsSignExpected); + return null; + } + lexer.SkipWhiteSpace(); + string nsURI; + try + { + nsURI = lexer.ParseEscapedData(); + } + catch (Exception e) + { + throw new XPointerSyntaxException(SR.GetString("SyntaxErrorInXmlnsSchemeData", e.Message)); + } + return new XmlnsSchemaPointerPart(prefix, nsURI); } + #endregion + } } Index: ShorthandPointer.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/ShorthandPointer.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ShorthandPointer.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ ShorthandPointer.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -8,52 +8,52 @@ #endregion -namespace Mvp.Xml.XPointer -{ +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// Shorthand XPointer pointer. + /// </summary> + internal class ShorthandPointer : Pointer + { + #region private members + + private string _NCName; + + #endregion + + #region constructors + /// <summary> - /// Shorthand XPointer pointer. + /// Creates shorthand XPointer given bare name. /// </summary> - internal class ShorthandPointer : Pointer + /// <param name="n">Shorthand (bare name)</param> + public ShorthandPointer(string n) { - #region private members - - private string _NCName; - - #endregion - - #region constructors + _NCName = n; + } - /// <summary> - /// Creates shorthand XPointer given bare name. - /// </summary> - /// <param name="n">Shorthand (bare name)</param> - public ShorthandPointer(string n) - { - _NCName = n; - } + #endregion - #endregion + #region Pointer overrides - #region Pointer overrides - - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer and returns - /// iterator over pointed nodes. - /// </summary> - /// <remarks>Note, that returned XPathNodeIterator is already moved once.</remarks> - /// <param name="nav">XPathNavigator to evaluate the - /// <see cref="XPointer"/> on.</param> - /// <returns><see cref="XPathNodeIterator"/> over pointed nodes</returns> - public override XPathNodeIterator Evaluate(XPathNavigator nav) - { - XPathNodeIterator result = XPathCache.Select("id('"+ _NCName + "')", nav, (XmlNamespaceManager)null); - if (result != null && result.MoveNext()) - { - return result; - } - else - throw new NoSubresourcesIdentifiedException(SR.GetString("NoSubresourcesIdentifiedException", _NCName)); - } - #endregion + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer and returns + /// iterator over pointed nodes. + /// </summary> + /// <remarks>Note, that returned XPathNodeIterator is already moved once.</remarks> + /// <param name="nav">XPathNavigator to evaluate the + /// <see cref="XPointer"/> on.</param> + /// <returns><see cref="XPathNodeIterator"/> over pointed nodes</returns> + public override XPathNodeIterator Evaluate(XPathNavigator nav) + { + XPathNodeIterator result = XPathCache.Select("id('" + _NCName + "')", nav, (XmlNamespaceManager)null); + if (result != null && result.MoveNext()) + { + return result; + } + else + throw new NoSubresourcesIdentifiedException(SR.GetString("NoSubresourcesIdentifiedException", _NCName)); } + #endregion + } } Index: XPath1SchemaPointerPart.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XPath1SchemaPointerPart.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPath1SchemaPointerPart.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XPath1SchemaPointerPart.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -1,6 +1,6 @@ #region using -using System; +using System; using System.Xml; using System.Xml.XPath; @@ -8,58 +8,58 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// xpath1() scheme based XPointer pointer part. - /// </summary> - internal class XPath1SchemaPointerPart : PointerPart - { - #region private members +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// xpath1() scheme based XPointer pointer part. + /// </summary> + internal class XPath1SchemaPointerPart : PointerPart + { + #region private members - private string _xpath; - - #endregion - - #region PointerPart overrides + private string _xpath; - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. - /// </summary> - /// <param name="doc">Document to evaluate pointer part on</param> - /// <param name="nm">Namespace manager</param> - /// <returns>Pointed nodes</returns> - public override XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm) - { - try - { - return XPathCache.Select(_xpath, doc, nm); - } - catch - { - return null; - } - } - - #endregion + #endregion - #region parser + #region PointerPart overrides - public static XPath1SchemaPointerPart ParseSchemaData(XPointerLexer lexer) - { - XPath1SchemaPointerPart part = new XPath1SchemaPointerPart(); - try - { - part.XPath = lexer.ParseEscapedData(); - } - catch (Exception e) - { - throw new XPointerSyntaxException(SR.GetString("SyntaxErrorInXPath1SchemeData", - e.Message)); - } - return part; - } + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. + /// </summary> + /// <param name="doc">Document to evaluate pointer part on</param> + /// <param name="nm">Namespace manager</param> + /// <returns>Pointed nodes</returns> + public override XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm) + { + try + { + return XPathCache.Select(_xpath, doc, nm); + } + catch + { + return null; + } + } - #endregion + #endregion + + #region parser + + public static XPath1SchemaPointerPart ParseSchemaData(XPointerLexer lexer) + { + XPath1SchemaPointerPart part = new XPath1SchemaPointerPart(); + try + { + part.XPath = lexer.ParseEscapedData(); + } + catch (Exception e) + { + throw new XPointerSyntaxException(SR.GetString("SyntaxErrorInXPath1SchemeData", + e.Message)); + } + return part; } + + #endregion + } } Index: XPointerSchema.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XPointerSchema.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPointerSchema.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XPointerSchema.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -5,37 +5,36 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// XPointer scheme. - /// </summary> - internal class XPointerSchema - { - - #region public members - - public enum SchemaType - { - Element, - Xmlns, - XPath1, - XPointer, - Unknown - } - public static IDictionary<string, SchemaType> Schemas = CreateSchemasTable(); +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// XPointer scheme. + /// </summary> + internal class XPointerSchema + { + #region public members - private static IDictionary<string, SchemaType> CreateSchemasTable() - { - IDictionary<string, SchemaType> table = new Dictionary<string, SchemaType>(4); - //<namespace uri>:<ncname> - table.Add(":element", SchemaType.Element); - table.Add(":xmlns", SchemaType.Xmlns); - table.Add(":xpath1", SchemaType.XPath1); - table.Add(":xpointer", SchemaType.XPointer); - return table; - } + public enum SchemaType + { + Element, + Xmlns, + XPath1, + XPointer, + Unknown + } + public static IDictionary<string, SchemaType> Schemas = CreateSchemasTable(); - #endregion + private static IDictionary<string, SchemaType> CreateSchemasTable() + { + IDictionary<string, SchemaType> table = new Dictionary<string, SchemaType>(4); + //<namespace uri>:<ncname> + table.Add(":element", SchemaType.Element); + table.Add(":xmlns", SchemaType.Xmlns); + table.Add(":xpath1", SchemaType.XPath1); + table.Add(":xpointer", SchemaType.XPointer); + return table; } + + #endregion + } } Index: ElementSchemaPointerPart.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/ElementSchemaPointerPart.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- ElementSchemaPointerPart.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ ElementSchemaPointerPart.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -9,102 +9,102 @@ #endregion -namespace Mvp.Xml.XPointer -{ +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// element() scheme based <see cref="XPointer"/> pointer part. + /// </summary> + internal class ElementSchemaPointerPart : PointerPart + { + #region private fields + + private string _xpath; + + #endregion + + #region public members + /// <summary> - /// element() scheme based <see cref="XPointer"/> pointer part. + /// Equivalent XPath expression. /// </summary> - internal class ElementSchemaPointerPart : PointerPart + public string XPath { - #region private fields + get { return _xpath; } + set { _xpath = value; } + } - private string _xpath; + #endregion - #endregion - - #region public members - - /// <summary> - /// Equivalent XPath expression. - /// </summary> - public string XPath - { - get { return _xpath; } - set { _xpath = value; } - } - - #endregion + #region PointerPart overrides - #region PointerPart overrides + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. + /// </summary> + /// <param name="doc">Document to evaluate pointer part on</param> + /// <param name="nm">Namespace manager</param> + /// <returns>Pointed nodes</returns> + public override XPathNodeIterator Evaluate(XPathNavigator doc, + XmlNamespaceManager nm) + { + return XPathCache.Select(_xpath, doc, nm); + } - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. - /// </summary> - /// <param name="doc">Document to evaluate pointer part on</param> - /// <param name="nm">Namespace manager</param> - /// <returns>Pointed nodes</returns> - public override XPathNodeIterator Evaluate(XPathNavigator doc, - XmlNamespaceManager nm) - { - return XPathCache.Select(_xpath, doc, nm); - } - - #endregion + #endregion - #region parser + #region parser - /// <summary> - /// Parses element() based pointer part and builds instance of <c>ElementSchemaPointerPart</c> class. - /// </summary> - /// <param name="lexer">Lexical analizer.</param> - /// <returns>Newly created <c>ElementSchemaPointerPart</c> object.</returns> - public static ElementSchemaPointerPart ParseSchemaData(XPointerLexer lexer) + /// <summary> + /// Parses element() based pointer part and builds instance of <c>ElementSchemaPointerPart</c> class. + /// </summary> + /// <param name="lexer">Lexical analizer.</param> + /// <returns>Newly created <c>ElementSchemaPointerPart</c> object.</returns> + public static ElementSchemaPointerPart ParseSchemaData(XPointerLexer lexer) + { + //Productions: + //[1] ElementSchemeData ::= (NCName ChildSequence?) | ChildSequence + //[2] ChildSequence ::= ('/' [1-9] [0-9]*)+ + StringBuilder xpathBuilder = new StringBuilder(); + ElementSchemaPointerPart part = new ElementSchemaPointerPart(); + lexer.NextLexeme(); + if (lexer.Kind == XPointerLexer.LexKind.NCName) + { + xpathBuilder.Append("id('"); + xpathBuilder.Append(lexer.NCName); + xpathBuilder.Append("')"); + lexer.NextLexeme(); + } + int childSequenceLen = 0; + while (lexer.Kind == XPointerLexer.LexKind.Slash) + { + lexer.NextLexeme(); + if (lexer.Kind != XPointerLexer.LexKind.Number) { - //Productions: - //[1] ElementSchemeData ::= (NCName ChildSequence?) | ChildSequence - //[2] ChildSequence ::= ('/' [1-9] [0-9]*)+ - StringBuilder xpathBuilder = new StringBuilder(); - ElementSchemaPointerPart part = new ElementSchemaPointerPart(); - lexer.NextLexeme(); - if (lexer.Kind == XPointerLexer.LexKind.NCName) - { - xpathBuilder.Append("id('"); - xpathBuilder.Append(lexer.NCName); - xpathBuilder.Append("')"); - lexer.NextLexeme(); - } - int childSequenceLen = 0; - while (lexer.Kind == XPointerLexer.LexKind.Slash) - { - lexer.NextLexeme(); - if (lexer.Kind != XPointerLexer.LexKind.Number) - { - Debug.WriteLine(SR.InvalidTokenInElementSchemeWhileNumberExpected); - return null; - } - if (lexer.Number == 0) - { - Debug.WriteLine(SR.ZeroIndexInElementSchemechildSequence); - return null; - } - childSequenceLen++; - xpathBuilder.Append("/*["); - xpathBuilder.Append(lexer.Number); - xpathBuilder.Append("]"); - lexer.NextLexeme(); - } - if (lexer.Kind != XPointerLexer.LexKind.RRBracket) - { - throw new XPointerSyntaxException(SR.InvalidTokenInElementSchemeWhileClosingRoundBracketExpected); - } - if (part.NCName==null && childSequenceLen==0) - { - Debug.WriteLine(SR.EmptyElementSchemeXPointer); - return null; - } - part.XPath = xpathBuilder.ToString(); - return part; - } - #endregion + Debug.WriteLine(SR.InvalidTokenInElementSchemeWhileNumberExpected); + return null; + } + if (lexer.Number == 0) + { + Debug.WriteLine(SR.ZeroIndexInElementSchemechildSequence); + return null; + } + childSequenceLen++; + xpathBuilder.Append("/*["); + xpathBuilder.Append(lexer.Number); + xpathBuilder.Append("]"); + lexer.NextLexeme(); + } + if (lexer.Kind != XPointerLexer.LexKind.RRBracket) + { + throw new XPointerSyntaxException(SR.InvalidTokenInElementSchemeWhileClosingRoundBracketExpected); + } + if (part.NCName == null && childSequenceLen == 0) + { + Debug.WriteLine(SR.EmptyElementSchemeXPointer); + return null; + } + part.XPath = xpathBuilder.ToString(); + return part; } + #endregion + } } Index: XPointerParser.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XPointerParser.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPointerParser.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XPointerParser.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -6,121 +6,121 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// XPointer parser. - /// </summary> - internal class XPointerParser - { +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// XPointer parser. + /// </summary> + internal class XPointerParser + { - #region private members + #region private members - private static IDictionary<string, XPointerSchema.SchemaType> _schemas = XPointerSchema.Schemas; + private static IDictionary<string, XPointerSchema.SchemaType> _schemas = XPointerSchema.Schemas; - private static XPointerSchema.SchemaType GetSchema(XPointerLexer lexer, IList<PointerPart> parts) - { - string schemaNSURI; - if (lexer.Prefix != String.Empty) + private static XPointerSchema.SchemaType GetSchema(XPointerLexer lexer, IList<PointerPart> parts) + { + string schemaNSURI; + if (lexer.Prefix != String.Empty) + { + schemaNSURI = null; + //resolve prefix + for (int i = parts.Count - 1; i >= 0; i--) + { + PointerPart part = parts[i]; + if (part is XmlnsSchemaPointerPart) + { + XmlnsSchemaPointerPart xmlnsPart = (XmlnsSchemaPointerPart)part; + if (xmlnsPart.Prefix == lexer.Prefix) { - schemaNSURI = null; - //resolve prefix - for (int i=parts.Count-1; i>=0; i--) - { - PointerPart part = parts[i]; - if (part is XmlnsSchemaPointerPart) - { - XmlnsSchemaPointerPart xmlnsPart = (XmlnsSchemaPointerPart)part; - if (xmlnsPart.Prefix == lexer.Prefix) - { - schemaNSURI = xmlnsPart.Uri; - break; - } - } - } - if (schemaNSURI == null) - //No binding for the prefix - ignore pointer part - return XPointerSchema.SchemaType.Unknown; - } - else - schemaNSURI = String.Empty; - XPointerSchema.SchemaType schemaType = _schemas[schemaNSURI + ':' + lexer.NCName]; - return schemaType != null ? schemaType : XPointerSchema.SchemaType.Unknown; - } + schemaNSURI = xmlnsPart.Uri; + break; + } + } + } + if (schemaNSURI == null) + //No binding for the prefix - ignore pointer part + return XPointerSchema.SchemaType.Unknown; + } + else + schemaNSURI = String.Empty; + XPointerSchema.SchemaType schemaType = _schemas[schemaNSURI + ':' + lexer.NCName]; + return schemaType != null ? schemaType : XPointerSchema.SchemaType.Unknown; + } - #endregion + #endregion - #region public members - - public static Pointer ParseXPointer(string xpointer) - { - IList<PointerPart> parts; - XPointerLexer lexer; - lexer = new XPointerLexer( xpointer); + #region public members + + public static Pointer ParseXPointer(string xpointer) + { + IList<PointerPart> parts; + XPointerLexer lexer; + lexer = new XPointerLexer(xpointer); + lexer.NextLexeme(); + if (lexer.Kind == XPointerLexer.LexKind.NCName && !lexer.CanBeSchemaName) + { + //Shorthand pointer + Pointer ptr = new ShorthandPointer(lexer.NCName); + lexer.NextLexeme(); + if (lexer.Kind != XPointerLexer.LexKind.Eof) + throw new XPointerSyntaxException(SR.InvalidTokenAfterShorthandPointer); + return ptr; + } + else + { + //SchemaBased pointer + parts = new List<PointerPart>(); + while (lexer.Kind != XPointerLexer.LexKind.Eof) + { + if ((lexer.Kind == XPointerLexer.LexKind.NCName || + lexer.Kind == XPointerLexer.LexKind.QName) && + lexer.CanBeSchemaName) + { + XPointerSchema.SchemaType schemaType = GetSchema(lexer, parts); + //Move to '(' lexer.NextLexeme(); - if (lexer.Kind == XPointerLexer.LexKind.NCName && !lexer.CanBeSchemaName) - { - //Shorthand pointer - Pointer ptr = new ShorthandPointer(lexer.NCName); - lexer.NextLexeme(); - if (lexer.Kind != XPointerLexer.LexKind.Eof) - throw new XPointerSyntaxException(SR.InvalidTokenAfterShorthandPointer); - return ptr; - } - else + switch (schemaType) { - //SchemaBased pointer - parts = new List<PointerPart>(); - while (lexer.Kind != XPointerLexer.LexKind.Eof) - { - if ((lexer.Kind == XPointerLexer.LexKind.NCName || - lexer.Kind == XPointerLexer.LexKind.QName) && - lexer.CanBeSchemaName) - { - XPointerSchema.SchemaType schemaType = GetSchema(lexer, parts); - //Move to '(' - lexer.NextLexeme(); - switch (schemaType) - { - case XPointerSchema.SchemaType.Element: - ElementSchemaPointerPart elemPart = ElementSchemaPointerPart.ParseSchemaData(lexer); - if (elemPart != null) - parts.Add(elemPart); - break; - case XPointerSchema.SchemaType.Xmlns: - XmlnsSchemaPointerPart xmlnsPart = XmlnsSchemaPointerPart.ParseSchemaData(lexer); - if (xmlnsPart != null) - parts.Add(xmlnsPart); - break; - case XPointerSchema.SchemaType.XPath1: - XPath1SchemaPointerPart xpath1Part = XPath1SchemaPointerPart.ParseSchemaData(lexer); - if (xpath1Part != null) - parts.Add(xpath1Part); - break; - case XPointerSchema.SchemaType.XPointer: - XPointerSchemaPointerPart xpointerPart = XPointerSchemaPointerPart.ParseSchemaData(lexer); - if (xpointerPart != null) - parts.Add(xpointerPart); - break; - default: - //Unknown scheme - lexer.ParseEscapedData(); - break; - } - //Skip ')' - lexer.NextLexeme(); - //Skip possible whitespace - if (lexer.Kind == XPointerLexer.LexKind.Space) - lexer.NextLexeme(); - } - else - throw new XPointerSyntaxException(SR.InvalidToken); - } - return new SchemaBasedPointer(parts, xpointer); + case XPointerSchema.SchemaType.Element: + ElementSchemaPointerPart elemPart = ElementSchemaPointerPart.ParseSchemaData(lexer); + if (elemPart != null) + parts.Add(elemPart); + break; + case XPointerSchema.SchemaType.Xmlns: + XmlnsSchemaPointerPart xmlnsPart = XmlnsSchemaPointerPart.ParseSchemaData(lexer); + if (xmlnsPart != null) + parts.Add(xmlnsPart); + break; + case XPointerSchema.SchemaType.XPath1: + XPath1SchemaPointerPart xpath1Part = XPath1SchemaPointerPart.ParseSchemaData(lexer); + if (xpath1Part != null) + parts.Add(xpath1Part); + break; + case XPointerSchema.SchemaType.XPointer: + XPointerSchemaPointerPart xpointerPart = XPointerSchemaPointerPart.ParseSchemaData(lexer); + if (xpointerPart != null) + parts.Add(xpointerPart); + break; + default: + //Unknown scheme + lexer.ParseEscapedData(); + break; } + //Skip ')' + lexer.NextLexeme(); + //Skip possible whitespace + if (lexer.Kind == XPointerLexer.LexKind.Space) + lexer.NextLexeme(); + } + else + throw new XPointerSyntaxException(SR.InvalidToken); } + return new SchemaBasedPointer(parts, xpointer); + } + } - #endregion - } + #endregion + } } Index: XPointerLexer.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XPointerLexer.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPointerLexer.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XPointerLexer.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -6,221 +6,221 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// XPointer lexical analyzer. - /// </summary> - internal class XPointerLexer +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// XPointer lexical analyzer. + /// </summary> + internal class XPointerLexer + { + + #region private members + + private string _ptr; + private int _ptrIndex; + private LexKind _kind; + private char _currChar; + private int _number; + private string _ncname; + private string _prefix; + private bool _canBeSchemaName; + + private string ParseName() { - - #region private members + int start = _ptrIndex - 1; + int len = 0; + while (LexUtils.IsNCNameChar(_currChar)) + { + NextChar(); len++; + } + return _ptr.Substring(start, len); + } - private string _ptr; - private int _ptrIndex; - private LexKind _kind; - private char _currChar; - private int _number; - private string _ncname; - private string _prefix; - private bool _canBeSchemaName; + #endregion - private string ParseName() - { - int start = _ptrIndex - 1; - int len = 0; - while (LexUtils.IsNCNameChar(_currChar)) - { - NextChar(); len ++; - } - return _ptr.Substring(start, len); - } + #region constructors - #endregion + public XPointerLexer(string p) + { + if (p == null) + throw new ArgumentNullException("pointer", SR.NullXPointer); + _ptr = p; + NextChar(); + } - #region constructors - - public XPointerLexer(string p) - { - if (p == null) - throw new ArgumentNullException("pointer", SR.NullXPointer); - _ptr = p; - NextChar(); - } - - #endregion + #endregion - #region public members + #region public members - public bool NextChar() - { - if (_ptrIndex < _ptr.Length) + public bool NextChar() + { + if (_ptrIndex < _ptr.Length) + { + _currChar = _ptr[_ptrIndex++]; + return true; + } + else + { + _currChar = '\0'; + return false; + } + } + + public LexKind Kind + { + get { return _kind; } + } + + public int Number + { + get { return _number; } + } + + public string NCName + { + get { return _ncname; } + } + + public string Prefix + { + get { return _prefix; } + } + + public bool CanBeSchemaName + { + get { return _canBeSchemaName; } + } + + public void SkipWhiteSpace() + { + while (LexUtils.IsWhitespace(_currChar)) + NextChar(); + } + + public bool NextLexeme() + { + switch (_currChar) + { + case '\0': + _kind = LexKind.Eof; + return false; + case '(': + case ')': + case '=': + case '/': + _kind = (LexKind)Convert.ToInt32(_currChar); + NextChar(); + break; + case '^': + NextChar(); + if (_currChar == '^' || _currChar == '(' || _currChar == ')') + { + _kind = LexKind.EscapedData; + NextChar(); + } + else + throw new XPointerSyntaxException(SR.CircumflexCharMustBeEscaped); + break; + default: + if (Char.IsDigit(_currChar)) + { + _kind = LexKind.Number; + int start = _ptrIndex - 1; + int len = 0; + while (Char.IsDigit(_currChar)) { - _currChar = _ptr[_ptrIndex++]; - return true; - } - else + NextChar(); len++; + } + _number = XmlConvert.ToInt32(_ptr.Substring(start, len)); + break; + } + else if (LexUtils.IsStartNameChar(_currChar)) + { + _kind = LexKind.NCName; + _prefix = String.Empty; + _ncname = ParseName(); + if (_currChar == ':') { - _currChar = '\0'; - return false; + //QName? + NextChar(); + _prefix = _ncname; + _kind = LexKind.QName; + if (LexUtils.IsStartNCNameChar(_currChar)) + _ncname = ParseName(); + else + throw new XPointerSyntaxException(SR.GetString("InvalidNameToken", _prefix, _currChar)); } - } - - public LexKind Kind - { - get { return _kind; } - } - - public int Number - { - get { return _number; } - } - - public string NCName - { - get { return _ncname; } - } - - public string Prefix - { - get { return _prefix; } - } - - public bool CanBeSchemaName - { - get { return _canBeSchemaName; } - } - - public void SkipWhiteSpace() - { + _canBeSchemaName = _currChar == '('; + break; + } + else if (LexUtils.IsWhitespace(_currChar)) + { + _kind = LexKind.Space; while (LexUtils.IsWhitespace(_currChar)) - NextChar(); - } - - public bool NextLexeme() + NextChar(); + break; + } + else + { + _kind = LexKind.EscapedData; + break; + } + } + return true; + } + + public string ParseEscapedData() + { + int depth = 0; + StringBuilder sb = new StringBuilder(); + while (true) + { + switch (_currChar) { - switch (_currChar) + case '^': + if (!NextChar()) + throw new XPointerSyntaxException(SR.UnexpectedEndOfSchemeData); + else if (_currChar == '^' || _currChar == '(' || _currChar == ')') + sb.Append(_currChar); + else + throw new XPointerSyntaxException(SR.CircumflexCharMustBeEscaped); + break; + case '(': + depth++; + goto default; + case ')': + if (depth-- == 0) { - case '\0' : - _kind = LexKind.Eof; - return false; - case '(': - case ')': - case '=': - case '/': - _kind = (LexKind)Convert.ToInt32(_currChar); - NextChar(); - break; - case '^': - NextChar(); - if (_currChar=='^' || _currChar=='(' || _currChar==')') - { - _kind = LexKind.EscapedData; - NextChar(); - } - else - throw new XPointerSyntaxException(SR.CircumflexCharMustBeEscaped); - break; - default: - if (Char.IsDigit(_currChar)) - { - _kind = LexKind.Number; - int start = _ptrIndex - 1; - int len = 0; - while (Char.IsDigit(_currChar)) - { - NextChar(); len ++; - } - _number = XmlConvert.ToInt32(_ptr.Substring(start, len)); - break; - } - else if (LexUtils.IsStartNameChar(_currChar)) - { - _kind = LexKind.NCName; - _prefix = String.Empty; - _ncname = ParseName(); - if (_currChar == ':') - { - //QName? - NextChar(); - _prefix = _ncname; - _kind = LexKind.QName; - if (LexUtils.IsStartNCNameChar(_currChar)) - _ncname = ParseName(); - else - throw new XPointerSyntaxException(SR.GetString("InvalidNameToken", _prefix, _currChar)); - } - _canBeSchemaName = _currChar=='('; - break; - } - else if (LexUtils.IsWhitespace(_currChar)) - { - _kind = LexKind.Space; - while (LexUtils.IsWhitespace(_currChar)) - NextChar(); - break; - } - else - { - _kind = LexKind.EscapedData; - break; - } - } - return true; - } - - public string ParseEscapedData() - { - int depth = 0; - StringBuilder sb = new StringBuilder(); - while (true) - { - switch (_currChar) - { - case '^': - if (!NextChar()) - throw new XPointerSyntaxException(SR.UnexpectedEndOfSchemeData); - else if (_currChar=='^' || _currChar=='(' || _currChar==')') - sb.Append(_currChar); - else - throw new XPointerSyntaxException(SR.CircumflexCharMustBeEscaped); - break; - case '(': - depth++; - goto default; - case ')': - if (depth-- == 0) - { - //Skip ')' - NextLexeme(); - return sb.ToString(); - } - else - goto default; - default: - sb.Append(_currChar); - break; - } - if (!NextChar()) - throw new XPointerSyntaxException(SR.UnexpectedEndOfSchemeData); - } - } - - public enum LexKind - { - NCName = 'N', - QName = 'Q', - LRBracket = '(', - RRBracket = ')', - Circumflex = '^', - Number = 'd', - Eq = '=', - Space = 'S', - Slash = '/', - EscapedData = 'D', - Eof = 'E' + //Skip ')' + NextLexeme(); + return sb.ToString(); + } + else + goto default; + default: + sb.Append(_currChar); + break; } - - #endregion + if (!NextChar()) + throw new XPointerSyntaxException(SR.UnexpectedEndOfSchemeData); + } } + + public enum LexKind + { + NCName = 'N', + QName = 'Q', + LRBracket = '(', + RRBracket = ')', + Circumflex = '^', + Number = 'd', + Eq = '=', + Space = 'S', + Slash = '/', + EscapedData = 'D', + Eof = 'E' + } + + #endregion + } } Index: PointerPart.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/PointerPart.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- PointerPart.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ PointerPart.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -6,23 +6,24 @@ #endregion -namespace Mvp.Xml.XPointer -{ - /// <summary> - /// Part of SchemaBased <see cref="XPointer"/> pointer. - /// </summary> - internal abstract class PointerPart { +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// Part of SchemaBased <see cref="XPointer"/> pointer. + /// </summary> + internal abstract class PointerPart + { - #region public methods + #region public methods - /// <summary> - /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. - /// </summary> - /// <param name="doc">Document to evaluate pointer part on</param> - /// <param name="nm">Namespace manager</param> - /// <returns>Pointed nodes</returns> - public abstract XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm); + /// <summary> + /// Evaluates <see cref="XPointer"/> pointer part and returns pointed nodes. + /// </summary> + /// <param name="doc">Document to evaluate pointer part on</param> + /// <param name="nm">Namespace manager</param> + /// <returns>Pointed nodes</returns> + public abstract XPathNodeIterator Evaluate(XPathNavigator doc, XmlNamespaceManager nm); - #endregion - } + #endregion + } } Index: XPointerReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v2/src/XPointerReader.cs,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- XPointerReader.cs 16 Oct 2005 15:17:03 -0000 1.1 +++ XPointerReader.cs 16 Oct 2005 16:02:15 -0000 1.2 @@ -1,7 +1,7 @@ #region using using System; -using System.Xml; +using System.Xml; using System.Xml.XPath; using System.Xml.Schema; using System.IO; @@ -11,463 +11,463 @@ #endregion -namespace Mvp.Xml.XPointer -{ +namespace Mvp.Xml.XPointer +{ + /// <summary> + /// <c>XPointerReader</c> implements XPointer Framework in + /// a fast, non-caching, forward-only way. <c>XPointerReader</c> + /// supports XPointer Framework, element(), xmlns(), xpath1() and + /// xpointer() (XPath subset only) XPointer schemes. + /// </summary> + /// <remarks>See <a href="http://mvp-xml.sf.net/xpointer">XPointer.NET homepage</a> for more info.</remarks> + /// <author>Oleg Tkachenko, ol...@tk...</author> + public class XPointerReader : XmlReader, IHasXPathNavigator + { + #region private members + + //Underlying reader + private XmlReader _reader; + //Nodes selected by xpointer + private XPathNodeIterator _pointedNodes; + //Document cache + private static IDictionary<string, WeakReference> _cache; + + /// <summary> - /// <c>XPointerReader</c> implements XPointer Framework in - /// a fast, non-caching, forward-only way. <c>XPointerReader</c> - /// supports XPointer Framework, element(), xmlns(), xpath1() and - /// xpointer() (XPath subset only) XPointer schemes. + /// Initializes the <c>XPointerReader</c>. /// </summary> - /// <remarks>See <a href="http://mvp-xml.sf.net/xpointer">XPointer.NET homepage</a> for more info.</remarks> - /// <author>Oleg Tkachenko, ol...@tk...</author> - public class XPointerReader : XmlReader, IHasXPathNavigator - { - #region private members + private void Init(XPathNavigator nav, string xpointer) + { + Pointer pointer = XPointerParser.ParseXPointer(xpointer); + _pointedNodes = pointer.Evaluate(nav); + //There is always at least one identified node + //XPathNodeIterator is already at the first node + _reader = new XPathNavigatorReader(_pointedNodes.Current); + } - //Underlying reader - private XmlReader _reader; - //Nodes... [truncated message content] |