读取html带自定义标签问题,TagHandler

昵__称 2014-08-01 08:16:29
我接受一个html"<g color='blue'>自定义</g>"
用Html.fromHtml()显示。
可是读取不到属性
public class MainActivity extends Activity {
TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
String s = "<g color='blue'>自定义</g>";
tv1.setText(Html.fromHtml(s, null, new GameTagHandler()));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
}

public class GameTagHandler implements TagHandler {
private int startIndex = 0;
private int stopIndex = 0;

@Override
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
if (tag.toLowerCase().equals("g")) {
if (opening) {
startGame(tag, output, xmlReader);
} else {
endGame(tag, output, xmlReader);
}
}
}

public void startGame(String tag, Editable output, XMLReader xmlReader) {
String cc;
try {
cc = (String) xmlReader.getProperty("color");
} catch (SAXNotRecognizedException e) {
e.printStackTrace();
} catch (SAXNotSupportedException e) {
e.printStackTrace();
}
startIndex = output.length();
}

public void endGame(String tag, Editable output, XMLReader xmlReader) {
stopIndex = output.length();
output.setSpan(new GameSpan(), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
String cc;
try {
cc = (String) xmlReader.getProperty("color");
} catch (SAXNotRecognizedException e) {
e.printStackTrace();
} catch (SAXNotSupportedException e) {
e.printStackTrace();
}
}

private class GameSpan extends ClickableSpan implements OnClickListener {

@Override
public void onClick(View v) {
Log.e("asdf", "sdsdfs");
}
}
}
}

求解
...全文
406 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵__称 2014-08-02
  • 打赏
  • 举报
回复
引用 3 楼 sagittarius1988 的回复:
是要这种效果?
看起来是这个效果,我想拿到color里面的值,这个得不到。
sagittarius1988 2014-08-02
  • 打赏
  • 举报
回复


是要这种效果?
卖水果的net 2014-08-02
  • 打赏
  • 举报
回复
不懂帮顶~~~~~~
昵__称 2014-08-02
  • 打赏
  • 举报
回复
引用 7 楼 sagittarius1988 的回复:
String s = "<g color='blue'>自定义</g>";
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
	        SAXParser parser = factory.newSAXParser();
	        XMLReader reader = parser.getXMLReader();
	        MyContentHandler sss = new MyContentHandler();
	        reader.setContentHandler(sss);
	        reader.parse(new InputSource(new StringReader(s)));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class MyContentHandler implements ContentHandler {
    private StringBuffer buf;
    public void setDocumentLocator( Locator locator ) {
    }
    public void startDocument() throws SAXException {
        buf=new StringBuffer();
        System.out.println("*******开始解析文档*******");
    }
    public void endDocument() throws SAXException {
        System.out.println("*******解析文档结束*******");
    }
    public void processingInstruction( String target, String instruction )
        throws SAXException {
    }
    public void startPrefixMapping( String prefix, String uri ) {
          System.out.println("\n前缀映射: " + prefix +" 开始!"+ "  它的URI是:" + uri);
    }
    public void endPrefixMapping( String prefix ) {
          System.out.println("\n前缀映射: "+prefix+" 结束!");
    }
    public void startElement( String namespaceURI, String localName,
                                  String fullName, Attributes attributes )
                          throws SAXException {
        System.out.println("\n 元素: " + "["+fullName+"]" +" 开始解析!");
        // 打印出属性信息
        for ( int i = 0; i < attributes.getLength(); i++ ) {
            System.out.println("\t属性名称:" + attributes.getLocalName(i)
                + " 属性值:" + attributes.getValue(i));
        }
    }
    public void endElement( String namespaceURI, String localName,
                                                      String fullName )
                          throws SAXException {
        //打印出非空的元素内容并将StringBuffer清空                  
      String nullStr="";
        if (!buf.toString().trim().equals(nullStr)){
           System.out.println("\t内容是: " + buf.toString().trim());
        }
        buf.setLength(0);
        //打印元素解析结束信息
        System.out.println("元素: "+"["+fullName+"]"+" 解析结束!");              
    }
    public void characters( char[] chars, int start, int length )
                                throws SAXException {
          //将元素内容累加到StringBuffer中                
          buf.append(chars,start,length);
    }
    public void ignorableWhitespace( char[] chars, int start, int length )
                                  throws SAXException {
    }
    public void skippedEntity( String name ) throws SAXException {
    }
}
这样是可以解析出来的,color的属性放在Attributes中了,但是我看源码里,如果是自定义的tag,解析时却不用这个Attributes,不知为何
没测试你这个又没用但是我找到的其他的方法http://blog.csdn.net/q445697127/article/details/38348031 其实xmlReader里面有属性,用反射得到那些值
昵__称 2014-08-02
  • 打赏
  • 举报
回复
引用 5 楼 u014497038 的回复:
感觉应该是一个很简单的一个东西,楼主一定是一个鑫鑫鑫鑫新新新手
那大神帮我这个鑫鑫鑫鑫新新新手解决下咯
sagittarius1988 2014-08-02
  • 打赏
  • 举报
回复
String s = "<g color='blue'>自定义</g>";
		try {
			SAXParserFactory factory = SAXParserFactory.newInstance();
	        SAXParser parser = factory.newSAXParser();
	        XMLReader reader = parser.getXMLReader();
	        MyContentHandler sss = new MyContentHandler();
	        reader.setContentHandler(sss);
	        reader.parse(new InputSource(new StringReader(s)));
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
public class MyContentHandler implements ContentHandler {
    private StringBuffer buf;
    public void setDocumentLocator( Locator locator ) {
    }
    public void startDocument() throws SAXException {
        buf=new StringBuffer();
        System.out.println("*******开始解析文档*******");
    }
    public void endDocument() throws SAXException {
        System.out.println("*******解析文档结束*******");
    }
    public void processingInstruction( String target, String instruction )
        throws SAXException {
    }
    public void startPrefixMapping( String prefix, String uri ) {
          System.out.println("\n前缀映射: " + prefix +" 开始!"+ "  它的URI是:" + uri);
    }
    public void endPrefixMapping( String prefix ) {
          System.out.println("\n前缀映射: "+prefix+" 结束!");
    }
    public void startElement( String namespaceURI, String localName,
                                  String fullName, Attributes attributes )
                          throws SAXException {
        System.out.println("\n 元素: " + "["+fullName+"]" +" 开始解析!");
        // 打印出属性信息
        for ( int i = 0; i < attributes.getLength(); i++ ) {
            System.out.println("\t属性名称:" + attributes.getLocalName(i)
                + " 属性值:" + attributes.getValue(i));
        }
    }
    public void endElement( String namespaceURI, String localName,
                                                      String fullName )
                          throws SAXException {
        //打印出非空的元素内容并将StringBuffer清空                  
      String nullStr="";
        if (!buf.toString().trim().equals(nullStr)){
           System.out.println("\t内容是: " + buf.toString().trim());
        }
        buf.setLength(0);
        //打印元素解析结束信息
        System.out.println("元素: "+"["+fullName+"]"+" 解析结束!");              
    }
    public void characters( char[] chars, int start, int length )
                                throws SAXException {
          //将元素内容累加到StringBuffer中                
          buf.append(chars,start,length);
    }
    public void ignorableWhitespace( char[] chars, int start, int length )
                                  throws SAXException {
    }
    public void skippedEntity( String name ) throws SAXException {
    }
}
这样是可以解析出来的,color的属性放在Attributes中了,但是我看源码里,如果是自定义的tag,解析时却不用这个Attributes,不知为何
sagittarius1988 2014-08-02
  • 打赏
  • 举报
回复
引用 4 楼 u014387289 的回复:
[quote=引用 3 楼 sagittarius1988 的回复:] 是要这种效果?
看起来是这个效果,我想拿到color里面的值,这个得不到。[/quote] 研究了会,感觉有点奇怪啊。看看源码先
多功能一体机 2014-08-02
  • 打赏
  • 举报
回复
感觉应该是一个很简单的一个东西,楼主一定是一个鑫鑫鑫鑫新新新手
猴头 2014-08-01
  • 打赏
  • 举报
回复
不懂帮顶~~~~~~

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧