Here is dummy XPathNavigator implementation I was talking about. Its main
advantage is almost zero memory footprint - it's just an access to parent's
Compile() method implementation.
I wonder if I overlooked any simpler solution (except for no reflection
hacks)? If not I hope V2 API has solved that problem already.
//Safe wrapper to hide dummy XPathNavigator
public class XPathCompiler {
private class DummyXpathNavig ator : XPathNavigator {
public override XPathNavigator Clone() {
return new DummyXpathNavig ator();
}
public override XPathNodeType NodeType {
get { return XPathNodeType.R oot; }
}
public override string LocalName {
get { return String.Empty; }
}
public override string NamespaceURI {
get { return String.Empty; }
}
public override string Name {
get { return String.Empty; }
}
public override string Prefix {
get { return String.Empty; }
}
public override string Value {
get { return String.Empty; }
}
public override string BaseURI {
get { return String.Empty; }
}
public override String XmlLang {
get { return String.Empty; }
}
public override bool IsEmptyElement {
get { return false; }
}
public override XmlNameTable NameTable {
get { return null; }
}
public override bool HasAttributes {
get { return false; }
}
public override string GetAttribute(st ring localName, string
namespaceURI) {
return string.Empty;
}
public override bool MoveToAttribute (string localName, string
namespaceURI) {
return false;
}
public override bool MoveToFirstAttr ibute() {
return false;
}
public override bool MoveToNextAttri bute() {
return false;
}
public override string GetNamespace(st ring name) {
return string.Empty;
}
public override bool MoveToNamespace (string name) {
return false;
}
public override bool MoveToFirstName space(XPathName spaceScope
namespaceScope) {
return false;
}
public override bool MoveToNextNames pace(XPathNames paceScope
namespaceScope) {
return false;
}
public override bool HasChildren {
get { return false; }
}
public override bool MoveToNext() {
return false;
}
public override bool MoveToPrevious( ) {
return false;
}
public override bool MoveToFirst() {
return false;
}
public override bool MoveToFirstChil d() {
return false;
}
public override bool MoveToParent() {
return false;
}
public override void MoveToRoot() {}
public override bool MoveTo( XPathNavigator other ) {
return false;
}
public override bool MoveToId(string id) {
return false;
}
public override bool IsSamePosition( XPathNavigator other) {
return false;
}
public override XPathNodeIterat or SelectDescendan ts(string name,
string namespaceURI, bool matchSelf) {
return null;
}
public override XPathNodeIterat or SelectChildren( string name,
string namespaceURI) {
return null;
}
public override XPathNodeIterat or SelectChildren( XPathNodeType
nodeType) {
return null;
}
public override XmlNodeOrder ComparePosition ( XPathNavigator
navigator ) {
return new XmlNodeOrder();
}
}
//Singleton
private static XPathNavigator _nav = new DummyXpathNavig ator();
//Here we go
public static XPathExpression Compile(string xpath) {
return _nav.Compile(xp ath);
}
}
And its usage:
XPathDocument doc = new XPathDocument(n ew StringReader("< foo/>"));
XPathNavigator nav = doc.CreateNavig ator();
XPathExpression xe = XPathCompiler.C ompile("/foo");
XPathNodeIterat or ni = nav.Select(xe);
while (ni.MoveNext()) {
Console.WriteLi ne(ni.Current.N ame);
}
--
Oleg Tkachenko
http://www.tkachenko.com/blog
Multiconn Technologies, Israel