0

.xml ファイルのみを含むフォルダーがあります。私のプログラムは、各ファイルを読み取り、タグ間に「false」があるファイルの名前を返す必要があります。私が考えていた:

        final Pattern pattern = Pattern.compile("<isTest>(.+?)</isTest>");
        final Matcher matcher = pattern.matcher("<isTest>false</isTest>");
        matcher.find();
        System.out.println(matcher.group(1));

私はJavaが初めてなので、どんな助けでも大歓迎です。

どこが間違っているのか教えてもらえますか?

public class FileIO 
{
    public static void main(String[] args) 
    {
        File dir = new File("d:\temp");

        List<String> list = new ArrayList<String>();

        //storing the names of the files in an array. 
        if (dir.isDirectory()) 
        {
          String[] fileList = dir.list();
          Pattern p = Pattern.compile("^(.*?)\\.xml$");

          for (String file : fileList) 
          {
            Matcher m = p.matcher(file);
            if (m.matches()) 
            {
              list.add(m.group(1));
            }
          }
        }

        try
        {

            XPathFactory xPathFactory = XPathFactory.newInstance( );
            XPath xpath = xPathFactory.newXPath(  );
            DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(  );
            DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(  );

            //Loop over files

            for (int i = 0; i < fileList.length; i++)
            {   
                Document doc =  builder.parse(fileList[i]);
                boolean matches = "false".equals(xpath.evaluate("//isTest/text()", doc)); 
            }
        }

        catch(Exception e) 
        {
            e.printStackTrace();
        } 
    }
}
4

2 に答える 2

1

ファイルに利用可能な XSD がある場合はJAXB、選択するソリューションです。XML で正規表現を使用したくないのは、CDATAネストされたタグと同様に 1 日が台無しになるからです。

そのようにSAXを使用することは、おそらく解決策です。

public static void main(String[] args)
{
SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean isTest= false;

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

        System.out.println("Start Element :" + qName);

        if (qName.equalsIgnoreCase("isTest")) {
            isTest= true;
        }

    }

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

        System.out.println("End Element :" + qName);

    }

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

        if (isTest) {
            System.out.println("is test : " + new String(ch, start, length));
            isTest= false;
        }
    }

     };

       saxParser.parse("c:\\file.xml", handler);  
}

ここから適応されたコード

于 2013-03-27T15:23:11.803 に答える
0

Sax はおそらくより効率的 (メモリに関して) ですが、これは xPath バージョンのスニペットです。

XPathFactory xPathFactory = XPathFactory.newInstance( );
XPath xpath = xPathFactory.newXPath(  );
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(  );
DocumentBuilder builder = docBuilderFactory.newDocumentBuilder(  );

/* Loop over files */

Document doc =  builder.parse(file);
boolean matches = "false".equals(xpath.evaluate("//isTest/text()", doc));
于 2013-03-27T16:22:08.800 に答える