/// <summary> /// Parses the specified node identifier. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <returns>The parsed node identifier. Null if the identifier cannot be parsed.</returns> public static ParsedNodeId Parse(NodeId nodeId) { // can only parse non-null string node identifiers. if (NodeId.IsNull(nodeId)) { return(null); } string identifier = nodeId.Identifier as string; if (String.IsNullOrEmpty(identifier)) { return(null); } ParsedNodeId parsedNodeId = new ParsedNodeId(); parsedNodeId.NamespaceIndex = nodeId.NamespaceIndex; // extract the type of identifier. parsedNodeId.RootType = 0; int start = 0; for (int ii = 0; ii < identifier.Length; ii++) { if (!Char.IsDigit(identifier[ii])) { start = ii; break; } parsedNodeId.RootType *= 10; parsedNodeId.RootType += (byte)(identifier[ii] - '0'); } if (start >= identifier.Length || identifier[start] != ':') { return(null); } // extract any component path. StringBuilder buffer = new StringBuilder(); int index = start + 1; int end = identifier.Length; bool escaped = false; while (index < end) { char ch = identifier[index++]; // skip any escape character but keep the one after it. if (ch == '&') { escaped = true; continue; } if (!escaped && ch == '?') { end = index; break; } buffer.Append(ch); escaped = false; } // extract any component. parsedNodeId.RootId = buffer.ToString(); parsedNodeId.ComponentPath = null; if (end < identifier.Length) { parsedNodeId.ComponentPath = identifier.Substring(end); } return(parsedNodeId); }
/// <summary> /// Parses the specified node identifier. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <returns>The parsed node identifier. Null if the identifier cannot be parsed.</returns> public static ParsedNodeId Parse(NodeId nodeId) { // can only parse non-null string node identifiers. if (NodeId.IsNull(nodeId)) { return null; } string identifier = nodeId.Identifier as string; if (String.IsNullOrEmpty(identifier)) { return null; } ParsedNodeId parsedNodeId = new ParsedNodeId(); parsedNodeId.NamespaceIndex = nodeId.NamespaceIndex; // extract the type of identifier. parsedNodeId.RootType = 0; int start = 0; for (int ii = 0; ii < identifier.Length; ii++) { if (!Char.IsDigit(identifier[ii])) { start = ii; break; } parsedNodeId.RootType *= 10; parsedNodeId.RootType += (byte)(identifier[ii] - '0'); } if (start >= identifier.Length || identifier[start] != ':') { return null; } // extract any component path. StringBuilder buffer = new StringBuilder(); int index = start+1; int end = identifier.Length; bool escaped = false; while (index < end) { char ch = identifier[index++]; // skip any escape character but keep the one after it. if (ch == '&') { escaped = true; continue; } if (!escaped && ch == '?') { end = index; break; } buffer.Append(ch); escaped = false; } // extract any component. parsedNodeId.RootId = buffer.ToString(); parsedNodeId.ComponentPath = null; if (end < identifier.Length) { parsedNodeId.ComponentPath = identifier.Substring(end); } return parsedNodeId; }