Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java的条件XML解析_Java_Xml_Parsing_Xpath_Sax - Fatal编程技术网

使用Java的条件XML解析

使用Java的条件XML解析,java,xml,parsing,xpath,sax,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="Fa

我正在寻找一个合适的解析器来解析给定的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");

    }
列出xml对象;
字符串文件名;
字符串tmpValue;
XmlObjectsMP;
公共SaxParser(字符串espXmlFileName){
this.espXmlFileName=espXmlFileName;
xmlObjects=newarraylist();
解析文档();
printDatas();
}
私有void printDatas(){
对于(XmlObjects tmpB:XmlObjects){
System.out.println(tmpB.toString());
}
}
私有文档(){
SAXParserFactory=SAXParserFactory.newInstance();
试一试{
SAXParser parser=factory.newSAXParser();
parse(espXmlFileName,this);
}捕获(ParserConfiguration异常e){
System.out.println(“ParserConfig错误”);
}捕获(SAXE异常){
System.out.println(“SAXException:xml格式不正确”);
}捕获(IOE异常){
System.out.println(“IO错误”);
}
}
public void startElement(字符串uri、字符串localName、字符串qName、,
org.xml.sax.Attributes)引发sax异常{
if(qName.equalsIgnoreCase(“员工”)){
字符串值1=attributes.getValue(“已验证”);
if(值1.相等信号情况(“假”)){
if(qName.equalsIgnoreCase(“名称”)){
字符串value2=attributes.getValue(“已验证”);
xmlObjectsTmp.setName(属性
.getValue(“名称”);
}
}
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
if(qName.equalsIgnoreCase(“员工”)){
添加(xmlObjectsTmp);
}
if(qName.equalsIgnoreCase(“名称”)){
xmlObjectsTmp.setName(tmpValue);
}
}
公共静态void main(字符串argv[]){
新的SaxParser(“C:\\xml\\xml2.xml”);
}

ContentHandler
startElement
方法中,当
validated
属性的值为
True
时,只需抛出
SAXException
即可中止解析

例如:

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

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

您可以展示一些您迄今为止尝试过的基本sax解析代码吗?Hirak,我添加了我的代码,您有什么解决方案吗?嗨,谢谢您的回复。如果我还需要检查标签上的验证值是否为False,我该怎么做?我已经更新了答案以覆盖
employee
street
。如果您需要和,我也可以更新。