【问题标题】:Java Sax XML Parser, parsing custom "values" within XML tags?Java Sax XML Parser,解析 XML 标记中的自定义“值”?
【发布时间】:2025-11-28 09:10:01
【问题描述】:

我以前没有过多地使用 XML,所以也许我对正确术语的无知在我搜索如何做到这一点时伤害了我。我有下面的代码 sn-p,我用它来解析下面的 XML 文件。问题是它只获取<Tag>Value</Tag> 内的 XML 值,但不能获取下面我需要获取 TagValue 的值,在本例中为 "Russell Diamond"

如果有人能就如何获得这样的自定义值提供帮助,我将不胜感激。谢谢。

<Tag TagName="#Subject" TagDataType="Text" TagValue="Russell Diamond"/>

我正在使用的 sn-p:

public void printElementNames(String fileName) throws IOException {
    //test write to file
       FileWriter fstream = new FileWriter("/home/user/Desktop/readEDRMtest.txt");
        final BufferedWriter out = new BufferedWriter(fstream);


    //

    try {
        SAXParserFactory parserFact = SAXParserFactory.newInstance();
        SAXParser parser = parserFact.newSAXParser();
        System.out.println("XML Elements: ");
        DefaultHandler handler = new DefaultHandler() {
            public void startElement(String uri, String lName, String ele,
                    Attributes attributes) throws SAXException {
                // print elements of xml
                System.out.println(ele);
                try {
                    out.write(ele);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

             public void characters(char ch[], int start, int length)
             throws SAXException {


                System.out.println("Value : "
                    + new String(ch, start, length));
                try {
                    out.write("Value : "
                            + new String(ch, start, length));
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        };

【问题讨论】:

  • 众所周知,sax 解析繁琐且难以使用,尽可能避免使用它

标签: java xml parsing sax saxparser


【解决方案1】:

这是您的代码 sn-p 的精简版和工作版:

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAX 
{
    public static void main(String[] args) throws IOException {
        new SAX().printElementNames("Delete.xml");
    }

    public void printElementNames(String fileName) throws IOException 
    {

        try {
            SAXParserFactory parserFact = SAXParserFactory.newInstance();
            SAXParser parser = parserFact.newSAXParser();
            DefaultHandler handler = new DefaultHandler() 
            {
                public void startElement(String uri, String lName, String ele,  Attributes attributes) throws SAXException {
                    System.out.println(ele);
                    System.out.println(attributes.getValue("TagValue"));
                }

                public void characters(char ch[], int start, int length) throws SAXException {
                    System.out.println("Value : " + new String(ch, start, length));
                }               
            };

            parser.parse(new File(fileName), handler);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

Delete.xml的内容

&lt;Tag TagName="#Subject" TagDataType="Text" TagValue="Russell Diamond"/&gt;

进一步阅读:

http://www.java-samples.com/showtutorial.php?tutorialid=152

【讨论】:

    【解决方案2】:

    您想研究提取属性。对此进行搜索,您会找到答案。

    DefaultHandler 类的 startElement(...) 方法传递一个名为 attributes 的参数,该参数引用一个 Attribute 对象。 API for the Attribute interface 将描述如何从该对象中提取您需要的信息。

    例如:

    out.write(attributes.getValue("TagValue"));
    

    【讨论】:

    • 上面添加了更多细节。亲爱的朋友!
    • 没问题,不客气!祝你的 xml 编码冒险好运!