xpathGenerate method
Returns an XPath string that can be used to query for this XmlNode.
If byId
is giving a fully qualified attribute name, the presence of
the attribute causes the generation of a shorter lookup expression.
Implementation
String xpathGenerate({String? byId}) {
final result = <String>[];
for (XmlNode? current = this; current != null; current = current.parent) {
switch (current) {
case XmlAttribute(qualifiedName: final name):
result.add(
_createSegment(
current,
where: (each) =>
each is XmlAttribute && each.qualifiedName == name,
filter: '@$name',
),
);
case XmlElement(qualifiedName: final name):
if (byId != null) {
final attribute = current.getAttributeNode(byId);
if (attribute != null) {
result.add('//*[@${attribute.toXmlString()}]');
return result.reversed.join('/');
}
}
result.add(
_createSegment(
current,
where: (each) => each is XmlElement && each.qualifiedName == name,
filter: name,
),
);
case XmlText():
case XmlCDATA():
result.add(
_createSegment(
current,
where: (each) => each is XmlText || each is XmlCDATA,
filter: 'text()',
),
);
case XmlComment():
result.add(
_createSegment(
current,
where: (each) => each is XmlComment,
filter: 'comment()',
),
);
case XmlProcessing():
result.add(
_createSegment(
current,
where: (each) => each is XmlProcessing,
filter: 'processing-instruction()',
),
);
case XmlDocument():
result.add(this == current ? '/' : '');
default:
result.add(
_createSegment(current, where: (each) => true, filter: 'node()'),
);
}
}
return result.reversed.join('/');
}