java - 使用 Java 进行条件 XML 解析

标签 java xml parsing xpath sax

我正在寻找一个合适的解析器来解析给定的 XML。我只想在标签 - 'employee'、属性 - 'validated=false' 时解析完整的 XML,否则停止解析。我们如何使用 SAX、STAX 或任何其他解析器执行这种条件 XML 解析?

<?xml version="1.0"?>
<database>
<employee validated="False">
  <name>Lars </name>
  <street validated="False"> Test </street>
  <telephone number= "0123"/>
</employee>  
<employee validated="True">
  <name>Baegs </name>
  <street validated="True"> Test </street>
  <telephone number= "0123"/>
</employee>  
</database>

我尝试了下面的 SAX 解析器代码

    List<XmlObjects> xmlObjects;
    String espXmlFileName;
    String tmpValue;
    XmlObjects xmlObjectsTmp;

    public SaxParser(String espXmlFileName) {
        this.espXmlFileName = espXmlFileName;
        xmlObjects = new ArrayList<XmlObjects>();
        parseDocument();
        printDatas();
    }

    private void printDatas() {
        for (XmlObjects tmpB : xmlObjects) {
            System.out.println(tmpB.toString());
        }

    }

    private void parseDocument() {
        SAXParserFactory factory = SAXParserFactory.newInstance();

        try {

            SAXParser parser = factory.newSAXParser();

            parser.parse(espXmlFileName, this);

        } catch (ParserConfigurationException e) {

            System.out.println("ParserConfig error");

        } catch (SAXException e) {

            System.out.println("SAXException : xml not well formed");

        } catch (IOException e) {

            System.out.println("IO error");

        }

    }


public void startElement(String uri, String localName, String qName,
            org.xml.sax.Attributes attributes) throws SAXException {
        if (qName.equalsIgnoreCase("employee")) {

            String value1 = attributes.getValue("validated");
            if (value1.equalsIgnoreCase("FALSE")) {
                if (qName.equalsIgnoreCase("name")) {
                    String value2 = attributes.getValue("validated");
                        xmlObjectsTmp.setName(attributes
                                            .getValue("name"));
                                }

                            }


    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        if (qName.equalsIgnoreCase("employee")) {
            xmlObjects.add(xmlObjectsTmp);
        }

        if (qName.equalsIgnoreCase("name")) {
            xmlObjectsTmp.setName(tmpValue);
        }


    }

    public static void main(String argv[]) {

        new SaxParser("C:\\xml\\xml2.xml");

    }

最佳答案

ContentHandlerstartElement 方法中,当您的 validated 时,您可以简单地抛出 SAXException 来中止解析。属性的值为 True

例如:

@Override
public void startElement(final String uri, final String localName,
    final String qName, final Attributes attributes) throws SAXException {

    if(localName.equalsIgnoreCase("employee") || localName.equalsIgnoreCase("street")) {
        final String validated = attributes.getValue("validated");
        if(validated != null && !validated.equals("False")) {
            throw new SAXException(localName + " has already been validated");
        } else {
            //your processing logic here
        }
    }
}

您可以注册ErrorHandler如果您愿意,可以用自己的方式处理错误。

关于java - 使用 Java 进行条件 XML 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23890541/

相关文章:

parsing - 用 Haskell 编写的解析器无法按预期工作

java - 使用glide将图片插入ArrayList

java - Eclipse - gwtupload - maxSize

java - 按下 UP 键时乒乓 Racket 底部不向上移动

xml - 使用 XPath 格式化日期

java - 查找父 Node 的属性并获取子 Node 属性的值

python - 使用 python 解析 CSV 文件并转换为 Pandas Dataframe 以绘制 Django 模板的图形

c# - 哪里有好的地址解析器

Java用另一个对象监视一个对象

java - FirebaseRecyclerAdapter 强制我实现我不想要/不需要的方法