I actually posted this about a year ago, but just ran across a need for the snippet again. Thought posting here might benefit others as well as serve as a repository. This allows you to get the path of a given XML node, as well as getting the qualified name of the node.
private string GetQName(XmlNode node) { string qname = string.Empty;
if (node.NamespaceURI.CompareTo(string.Empty) != 0) { if (node.Prefix.CompareTo(string.Empty) != 0) { //If the prefix is present, use it.
if (node.NodeType == XmlNodeType.Attribute){qname = "@";} qname = qname + node.Prefix + ":" + node.LocalName ; } else { //The node is in the default namespace, the prefix is not //present. if (node.NodeType == XmlNodeType.Attribute) qname = "@*[local-name() = '" + node.LocalName + "' andnamespace-uri()='" + node.NamespaceURI + "']"; else //QName is a misnomer here, but the current node belongs in anon-prefixed namespace... qname = "node()[local-name() = '" + node.LocalName + "' andnamespace-uri()='" + node.NamespaceURI + "']"; } } else { if (node.NodeType == XmlNodeType.Attribute) qname = "@" + node.Name; else qname = node.Name; } return(qname); }
private string GetPathFromNode(XmlNode baseNode) { string path = ""; XmlNodeList nodes = null; if(baseNode.NodeType == XmlNodeType.Attribute ) { nodes = baseNode.SelectNodes("ancestor::*"); } else { nodes = baseNode.SelectNodes("ancestor-or-self::* |ancestor-or-self::@*"); } foreach(XmlNode node in nodes) { int nodePosition =node.SelectNodes("preceding-sibling::*[local-name()='" + node.LocalName + "'and namespace-uri()='" + node.NamespaceURI + "']").Count +1; path += "/" + GetQName(node) + "[" + nodePosition.ToString() + "]"; } if(baseNode.NodeType == XmlNodeType.Attribute) path += "/" + GetQName(baseNode); return(path); }