private static XNode CreateXNode(GumboNode node) { switch (node.type) { case GumboNodeType.GUMBO_NODE_DOCUMENT: var docNode = (GumboDocumentNode)node; return new XDocument(docNode.GetChildren().Select(x => CreateXNode(x))); case GumboNodeType.GUMBO_NODE_ELEMENT: case GumboNodeType.GUMBO_NODE_TEMPLATE: var elementNode = (GumboElementNode)node; string elementName = GetName(elementNode.element.tag); var attributes = elementNode.GetAttributes().Select(x => new XAttribute( NativeUtf8Helper.StringFromNativeUtf8(x.name), NativeUtf8Helper.StringFromNativeUtf8(x.value))); var children = elementNode.GetChildren().Select(x => CreateXNode(x)); return new XElement(elementName, attributes, children); case GumboNodeType.GUMBO_NODE_TEXT: var textNode = (GumboTextNode)node; return new XText(NativeUtf8Helper.StringFromNativeUtf8(textNode.text.text)); case GumboNodeType.GUMBO_NODE_CDATA: var cDataNode = (GumboTextNode)node; return new XCData(NativeUtf8Helper.StringFromNativeUtf8(cDataNode.text.text)); case GumboNodeType.GUMBO_NODE_COMMENT: var commentNode = (GumboTextNode)node; return new XComment(NativeUtf8Helper.StringFromNativeUtf8(commentNode.text.text)); case GumboNodeType.GUMBO_NODE_WHITESPACE: var spaceNode = (GumboTextNode)node; return new XText(NativeUtf8Helper.StringFromNativeUtf8(spaceNode.text.text)); default: throw new NotImplementedException($"Node type '{node.type}' is not implemented"); } }
public NodeWrapper(GumboNode node, NodeWrapper parent) { Type = node.type; Index = (int)node.index_within_parent; ParseFlags = node.parse_flags; Parent = parent; }
public NodeWrapper CreateNodeWrapper(GumboNode node, NodeWrapper parent = null) { switch (node.type) { case GumboNodeType.GUMBO_NODE_DOCUMENT: return(new DocumentWrapper((GumboDocumentNode)node, this)); case GumboNodeType.GUMBO_NODE_ELEMENT: case GumboNodeType.GUMBO_NODE_TEMPLATE: return(new ElementWrapper((GumboElementNode)node, parent, this)); case GumboNodeType.GUMBO_NODE_TEXT: case GumboNodeType.GUMBO_NODE_CDATA: case GumboNodeType.GUMBO_NODE_COMMENT: case GumboNodeType.GUMBO_NODE_WHITESPACE: return(new TextWrapper((GumboTextNode)node, parent)); default: throw new NotImplementedException($"Node type '{node.type}' is not implemented"); } }
/// <summary> /// Dealing with C unions, we need a two-step marshalling to get the actual instance. /// </summary> /// <param name="nodePointer"></param> /// <returns></returns> private static GumboNode MarshalToSpecificNode(IntPtr nodePointer) { GumboNode node = (GumboNode)Marshal.PtrToStructure(nodePointer, typeof(GumboNode)); switch (node.type) { case GumboNodeType.GUMBO_NODE_DOCUMENT: return(MarshalTo <GumboDocumentNode>(nodePointer)); case GumboNodeType.GUMBO_NODE_ELEMENT: return(MarshalTo <GumboElementNode>(nodePointer)); case GumboNodeType.GUMBO_NODE_TEXT: case GumboNodeType.GUMBO_NODE_CDATA: case GumboNodeType.GUMBO_NODE_COMMENT: case GumboNodeType.GUMBO_NODE_WHITESPACE: return(MarshalTo <GumboTextNode>(nodePointer)); default: throw new NotSupportedException(String.Format("Unknown node type '{0}'", (int)node.type)); } }
private static XNode CreateXNode(GumboNode node) { switch (node.type) { case GumboNodeType.GUMBO_NODE_DOCUMENT: var docNode = (GumboDocumentNode)node; return(new XDocument(docNode.GetChildren().Select(x => CreateXNode(x)))); case GumboNodeType.GUMBO_NODE_ELEMENT: case GumboNodeType.GUMBO_NODE_TEMPLATE: var elementNode = (GumboElementNode)node; string elementName = GetName(elementNode.element.tag); var attributes = elementNode.GetAttributes().Select(x => new XAttribute( NativeUtf8Helper.StringFromNativeUtf8(x.name), NativeUtf8Helper.StringFromNativeUtf8(x.value))); var children = elementNode.GetChildren().Select(x => CreateXNode(x)); return(new XElement(elementName, attributes, children)); case GumboNodeType.GUMBO_NODE_TEXT: var textNode = (GumboTextNode)node; return(new XText(NativeUtf8Helper.StringFromNativeUtf8(textNode.text.text))); case GumboNodeType.GUMBO_NODE_CDATA: var cDataNode = (GumboTextNode)node; return(new XCData(NativeUtf8Helper.StringFromNativeUtf8(cDataNode.text.text))); case GumboNodeType.GUMBO_NODE_COMMENT: var commentNode = (GumboTextNode)node; return(new XComment(NativeUtf8Helper.StringFromNativeUtf8(commentNode.text.text))); case GumboNodeType.GUMBO_NODE_WHITESPACE: var spaceNode = (GumboTextNode)node; return(new XText(NativeUtf8Helper.StringFromNativeUtf8(spaceNode.text.text))); default: throw new NotImplementedException($"Node type '{node.type}' is not implemented"); } }
public NodeWrapper(GumboNode node, NodeWrapper parent) { Type = node.type; ParseFlags = node.parse_flags; Parent = parent; }