Ejemplo n.º 1
0
   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("&amp;");
         } else if(c==0xa0) {
       builder.Append("&nbsp;");
         } else if(c=='"') {
       builder.Append("&quot;");
         } 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("&amp;");
       } else if(c==0xa0) {
         builder.Append("&nbsp;");
       } else if(c=='<') {
         builder.Append("&lt;");
       } else if(c=='>') {
         builder.Append("&gt;");
       } 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
       }
   }