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(Monobjc.Tools.Sdp.Properties.Resources.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();
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(Monobjc.Tools.Sdp.Properties.Resources.InvalidToken);
}
return new SchemaBasedPointer(parts, xpointer);
}
}