如何获取<;标记名>;在Java中包含其他嵌入的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

我有一个包含HTML标记的XML文档:

<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;
}

}