private void collectElements(INode c, string s, IList<IElement> nodes) { if(c.getNodeType()==NodeType.ELEMENT_NODE){ Element e=(Element)c; if(s==null || e.getLocalName().Equals(s)){ nodes.Add(e); } } foreach(var node in c.getChildNodes()){ collectElements(node,s,nodes); } }
private void collectElementsHtml(INode c, string s, string sLowercase, IList<IElement> nodes) { if(c.getNodeType()==NodeType.ELEMENT_NODE){ Element e=(Element)c; if(s==null){ nodes.Add(e); } else if(HtmlParser.HTML_NAMESPACE.Equals(e.getNamespaceURI()) && e.getLocalName().Equals(sLowercase)){ nodes.Add(e); } else if(e.getLocalName().Equals(s)){ nodes.Add(e); } } foreach(var node in c.getChildNodes()){ collectElements(node,s,nodes); } }
private void fragmentSerializeInner( INode current, StringBuilder builder) { if(current.getNodeType()==NodeType.ELEMENT_NODE){ IElement e=((IElement)current); string tagname=e.getTagName(); string namespaceURI=e.getNamespaceURI(); if(HtmlParser.HTML_NAMESPACE.Equals(namespaceURI) || HtmlParser.SVG_NAMESPACE.Equals(namespaceURI) || HtmlParser.MATHML_NAMESPACE.Equals(namespaceURI)){ tagname=e.getLocalName(); } builder.Append('<'); builder.Append(tagname); foreach(var attr in e.getAttributes()){ namespaceURI=attr.getNamespaceURI(); builder.Append(' '); if(namespaceURI==null || namespaceURI.Length==0){ builder.Append(attr.getLocalName()); } else if(namespaceURI.Equals(HtmlParser.XML_NAMESPACE)){ builder.Append("xml:"); builder.Append(attr.getLocalName()); } else if(namespaceURI.Equals( "http://www.w3.org/2000/xmlns/")){ if(!"xmlns".Equals(attr.getLocalName())) { builder.Append("xmlns:"); } builder.Append(attr.getLocalName()); } else if(namespaceURI.Equals(HtmlParser.XLINK_NAMESPACE)){ builder.Append("xlink:"); builder.Append(attr.getLocalName()); } else { builder.Append(attr.getName()); } builder.Append("=\""); string value=attr.getValue(); for(int i=0;i<value.Length;i++){ char c=value[i]; if(c=='&') { builder.Append("&"); } else if(c==0xa0) { builder.Append(" "); } else if(c=='"') { builder.Append("""); } else { builder.Append(c); } } builder.Append('"'); } builder.Append('>'); if(HtmlParser.HTML_NAMESPACE.Equals(namespaceURI)){ string localName=e.getLocalName(); if("area".Equals(localName) || "base".Equals(localName) || "basefont".Equals(localName) || "bgsound".Equals(localName) || "br".Equals(localName) || "col".Equals(localName) || "embed".Equals(localName) || "frame".Equals(localName) || "hr".Equals(localName) || "img".Equals(localName) || "input".Equals(localName) || "keygen".Equals(localName) || "link".Equals(localName) || "menuitem".Equals(localName) || "meta".Equals(localName) || "param".Equals(localName) || "source".Equals(localName) || "track".Equals(localName) || "wbr".Equals(localName)) return; if("pre".Equals(localName) || "textarea".Equals(localName) || "listing".Equals(localName)){ foreach(var node in e.getChildNodes()){ if(node.getNodeType()==NodeType.TEXT_NODE && ((IText)node).getData().Length>0 && ((IText)node).getData()[0]=='\n'){ builder.Append('\n'); } } } } // Recurse foreach(var child in e.getChildNodes()){ fragmentSerializeInner(child,builder); } builder.Append("</"); builder.Append(tagname); builder.Append(">"); } else if(current.getNodeType()==NodeType.TEXT_NODE){ INode parent=current.getParentNode(); if(parent is IElement && HtmlParser.HTML_NAMESPACE.Equals(((IElement)parent).getNamespaceURI())){ string localName=((IElement)parent).getLocalName(); if("script".Equals(localName) || "style".Equals(localName) || "script".Equals(localName) || "xmp".Equals(localName) || "iframe".Equals(localName) || "noembed".Equals(localName) || "noframes".Equals(localName) || "plaintext".Equals(localName)){ builder.Append(((IText)current).getData()); } else { string value=((IText)current).getData(); for(int i=0;i<value.Length;i++){ char c=value[i]; if(c=='&') { builder.Append("&"); } else if(c==0xa0) { builder.Append(" "); } else if(c=='<') { builder.Append("<"); } else if(c=='>') { builder.Append(">"); } else { builder.Append(c); } } } } } else if(current.getNodeType()==NodeType.COMMENT_NODE){ builder.Append("<!--"); builder.Append(((IComment)current).getData()); builder.Append("-->"); } else if(current.getNodeType()==NodeType.DOCUMENT_TYPE_NODE){ builder.Append("<!DOCTYPE "); builder.Append(((IDocumentType)current).getName()); builder.Append(">"); } else if(current.getNodeType()==NodeType.PROCESSING_INSTRUCTION_NODE){ builder.Append("<?"); builder.Append(((IProcessingInstruction)current).getTarget()); builder.Append(' '); builder.Append(((IProcessingInstruction)current).getData()); builder.Append(">"); // NOTE: may be erroneous } }