
Public Member Functions | |
| XPathElement () | |
| XPathElement (string child_name) | |
| XPathElement (string child_name, int child_idx) | |
| XPathElement (string child_name, int child_idx, string attr_name, string attr_value) | |
| int | parse (string path, int idx) |
| XMLNode | find (XMLNode node) |
| bool | matches (AbstractXMLNode node, int[] n) |
Public Attributes | |
| string | _childName |
| Dictionary< string, string > | _mAttrAndAttr = new Dictionary<string, string>() |
Private Attributes | |
| int | _childIdx |
Definition at line 45 of file XPathElement.cs.
| XMLStorage::XPathElement::XPathElement | ( | ) | [inline] |
| XMLStorage::XPathElement::XPathElement | ( | string | child_name ) | [inline] |
Definition at line 52 of file XPathElement.cs.
References _childIdx, and _childName.
{
_childName = child_name;
_childIdx = -1;
}
| XMLStorage::XPathElement::XPathElement | ( | string | child_name, |
| int | child_idx | ||
| ) | [inline] |
Definition at line 58 of file XPathElement.cs.
References _childIdx, and _childName.
{
_childName = child_name;
_childIdx = child_idx;
}
| XMLStorage::XPathElement::XPathElement | ( | string | child_name, |
| int | child_idx, | ||
| string | attr_name, | ||
| string | attr_value | ||
| ) | [inline] |
Definition at line 64 of file XPathElement.cs.
References _childIdx, _childName, and _mAttrAndAttr.
{
_childName = child_name;
_childIdx = child_idx;
_mAttrAndAttr.Add(attr_name, attr_value);
}
Definition at line 144 of file XPathElement.cs.
References XMLStorage::XMLNode::getChildren(), and matches().
Referenced by XMLStorage::XMLNode::createRelative(), XMLStorage::XMLNode::findRelative(), XMLStorage::XMLPos::goDown(), and XMLStorage::XMLPos::smartCreate().
{
int[] n = new int[] {0}; // index in array for call-by-reference matches()
foreach(XMLNode it in node.getChildren())
if (matches(it, n))
return it;
return null;
}

| bool XMLStorage::XPathElement::matches | ( | AbstractXMLNode | node, |
| int[] | n | ||
| ) | [inline] |
Definition at line 155 of file XPathElement.cs.
References _childIdx, _childName, _mAttrAndAttr, and XMLStorage::AbstractXMLNode::ToString().
Referenced by find(), and XMLStorage::XMLStreamReader::find().
{
if (node.ToString() != _childName)
if (_childName != "*") // use asterisk as wildcard
return false;
foreach(KeyValuePair<string, string> it in _mAttrAndAttr)
if (node.get(it.Key) != it.Value)
return false;
if (_childIdx == -1)
return true;
else if (n[0]++ == _childIdx)
return true;
else
return false;
}

| int XMLStorage::XPathElement::parse | ( | string | path, |
| int | idx | ||
| ) | [inline] |
Definition at line 78 of file XPathElement.cs.
References _childIdx, _childName, _mAttrAndAttr, and XMLStorage::XMLHelper::unescape().
Referenced by XMLStorage::XPath::init().
{
int f = path.IndexOf('/', idx);
if (f == idx)
return -1;
// parse relative path
int l = f!=-1? f-idx: path.Length-idx;
string comp = path.Substring(idx, l);
idx += l;
// look for [n] and [@attr_name="attr_value"] expressions in path components
int idxBracket = comp.IndexOf('[');
l = idxBracket!=-1? idxBracket: comp.Length;
_childName = comp.Substring(0, l);
if (idxBracket != -1) {
string expr = XMLHelper.unescape(comp.Substring(idxBracket), '[', ']');
int i = 0;
while(i<expr.Length && char.IsWhiteSpace(expr[i])) ++i;
if (i<expr.Length && char.IsDigit(expr[i])) {
int n;
if (Int32.TryParse(expr.Substring(i), out n)) // read index number
if (n != 0)
_childIdx = n - 1; // convert into zero based index
} else {
while(i<expr.Length && expr[i]=='@') {
int idxEqual = expr.IndexOf('=', ++i);
if (idxEqual != -1) {
// look for delimiters
//TODO If there is neither an opening nor a closing delimiter, we should look for white space as delimiter.
int idxDel1 = idxEqual + 1;
char del1 = expr[idxDel1];
int idxDel2 = del1=='\'' || del1=='"'? expr.IndexOf(del1, idxDel1+1): -1;
// read attribute name and value
string attrName = XMLHelper.unescape(expr.Substring(i, idxEqual-i));
string attrValue = idxDel2!=-1? XMLHelper.unescape(expr.Substring(idxDel1, ++idxDel2-idxDel1)):
XMLHelper.unescape(expr.Substring(idxDel1));
_mAttrAndAttr.Add(attrName, attrValue);
if (idxDel2 == -1)
break;
i = idxDel2 + 1;
while(i<expr.Length && char.IsWhiteSpace(expr[i])) ++i;
// handle [@attr1="value1" and @attr2="value2"] expressions
// handle expressions like [@name="1.2" and @profil="IPE" and @date="2006_07"]
if (string.Compare(expr, 0, "and ", 0, 4, true) == 0)
i += 4;
}
while(i<expr.Length && char.IsWhiteSpace(expr[i])) ++i;
}
}
}
return idx;
}

int XMLStorage::XPathElement::_childIdx [private] |
Definition at line 73 of file XPathElement.cs.
Referenced by matches(), parse(), and XPathElement().
Definition at line 72 of file XPathElement.cs.
Referenced by XMLStorage::XMLNode::createRelative(), XMLStorage::XMLStreamReader::find(), matches(), parse(), and XPathElement().
| Dictionary<string, string> XMLStorage::XPathElement::_mAttrAndAttr = new Dictionary<string, string>() |
Definition at line 76 of file XPathElement.cs.
Referenced by XMLStorage::XMLNode::createRelative(), matches(), parse(), and XPathElement().
1.7.2