如何获取<;标记名>;在Java中包含其他嵌入的XML标记?
我有一个包含HTML标记的XML文档:如何获取<;标记名>;在Java中包含其他嵌入的XML标记?,java,xml,dom,xml-parsing,sax,Java,Xml,Dom,Xml Parsing,Sax,我有一个包含HTML标记的XML文档: <chapter> <h1>title of content</h1> <p> my paragraph ... </p> </chapter> 更新2:(使用StringBuilder) 我通过以下方式积累了StringBuilder的字符: public class MyXMLHandler extends DefaultHandler { priva
<chapter>
<h1>title of content</h1>
<p> my paragraph ... </p>
</chapter>
更新2:(使用StringBuilder)
我通过以下方式积累了StringBuilder的字符:
public class MyXMLHandler extends DefaultHandler {
private boolean tagFlag = false;
private char[] temp;
String insideTag;
private String tag;
private StringBuilder builder;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase(tag)) {
builder = new StringBuilder();
tagFlag = true;
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (qName.equalsIgnoreCase(tag)) {
insideTag = builder.toString();
tagFlag = false;
}
}
public void characters(char ch[], int start, int length)
throws SAXException {
if (tagFlag) {
builder.append(ch, start, length);
}
}
public String getInsideTag(String tag) {
this.tag = tag;
return insideTag;
}
}
但是builder.append(ch,start,length)
不会像
和
那样在缓冲区中追加开始标记。此代码用于打印输出:
title of content
my paragraph ...
而不是预期产出:
<h1>title of content</h1>
<p> my paragraph ... </p>
内容的标题
我的段落
更新3:
最后,我实现了解析器处理程序:
public class MyXMLHandler extends DefaultHandler {
private boolean tagFlag = false;
private String insideTag;
private String tag;
private StringBuilder builder;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase(tag)) {
builder = new StringBuilder();
tagFlag = true;
}
if (tagFlag) {
builder.append("<" + qName);
for (int i = 0; i < attributes.getLength(); i++) {
builder.append(" " + attributes.getLocalName(i) + "=\"" +
attributes.getValue(i) + "\"");
}
builder.append(">");
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (tagFlag) {
builder.append("</" + qName + ">");
}
if (qName.equalsIgnoreCase(tag)) {
insideTag = builder.toString();
tagFlag = false;
}
System.out.println("End Element :" + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
temp = ch;
if (tagFlag) {
builder.append(ch, start, length);
}
}
public String getInsideTag(String tag) {
this.tag = tag;
return insideTag;
}
}
公共类MyXMLHandler扩展了DefaultHandler{
私有布尔标记标志=false;
私有字符串内插标签;
私有字符串标签;
私人建筑商;
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
if(qName.equalsIgnoreCase(标记)){
生成器=新的StringBuilder();
tagFlag=true;
}
如果(标记标志){
生成器。追加(“”);
}
}
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
如果(标记标志){
生成器。追加(“”);
}
if(qName.equalsIgnoreCase(标记)){
insideTag=builder.toString();
tagFlag=false;
}
System.out.println(“结束元素:+qName”);
}
公共无效字符(字符ch[],整数开始,整数长度)
抛出SAX异常{
温度=ch;
如果(标记标志){
builder.append(ch,start,length);
}
}
公共字符串getInsideTag(字符串标记){
this.tag=tag;
返回内部标签;
}
}
代码的问题在于,您试图记住通过characters
方法传递给您的字符串的起始和结束位置。在抛出的异常中看到的是一个内部标记的结果,该标记从字符缓冲区的末尾开始,在下一个字符缓冲区的开头结束
使用sax,您需要在提供字符时复制它们,或者在需要时清除它们占用的临时缓冲区
最好的办法不是记住缓冲区中的位置,而是在
startElement
中创建一个新的StringBuilder
,并在其中添加字符,然后在endElement
中从构建器中取出完整的字符串尝试使用,我多年前就用过了,版本1.5,它只是像您一样为xml创建映射。只是简单介绍了如何使用Digester,但它适用于1.5版,目前有3.0版,我认为上一个版本包含很多新功能…您需要更好地定义输入XML,并尽可能明确地定义所需的输出,因为您的帖子对此并不清楚。看起来您希望保留一些标记,但不希望保留其他标记。此外,如果XML非常大,则DOM可能不可行,因为DOM要求在执行分析之前加载整个文档模型。其他选项是SAX和StAX。感谢您编辑我的糟糕文章。是的,我需要得到标签的内容。在中,我用SAX实现更新了我的帖子,但在某些情况下它不起作用。您能帮我回答更新后的问题吗?我通过向StringBuilder添加字符来更改代码,但问题是在characters()回调中,我无法访问标记名的开始和结束!因此,我必须像这样更改StringBuilder参数:handler.append(ch,start-startTag.length,length+endTag.length)。我应该怎么做?您可以在start-and-endElement方法中添加开始和结束标记。
<h1>title of content</h1>
<p> my paragraph ... </p>
public class MyXMLHandler extends DefaultHandler {
private boolean tagFlag = false;
private String insideTag;
private String tag;
private StringBuilder builder;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase(tag)) {
builder = new StringBuilder();
tagFlag = true;
}
if (tagFlag) {
builder.append("<" + qName);
for (int i = 0; i < attributes.getLength(); i++) {
builder.append(" " + attributes.getLocalName(i) + "=\"" +
attributes.getValue(i) + "\"");
}
builder.append(">");
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
if (tagFlag) {
builder.append("</" + qName + ">");
}
if (qName.equalsIgnoreCase(tag)) {
insideTag = builder.toString();
tagFlag = false;
}
System.out.println("End Element :" + qName);
}
public void characters(char ch[], int start, int length)
throws SAXException {
temp = ch;
if (tagFlag) {
builder.append(ch, start, length);
}
}
public String getInsideTag(String tag) {
this.tag = tag;
return insideTag;
}
}