Зачем java сохранять пустые строки при разборе этого XML? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь, чтобы java анализировал строки файла XML, и когда он находит строку, содержащую определенное слово, извлекает значение из этого элемента. Это все делается через манипуляции со строками. Локально я проверил, что это работает с использованием копии того же файла, который он будет смотреть на сервере, в конечном итоге.

Однако по какой-то причине при запуске через удаленный сервер он не работает, как предполагалось,В результате отображаются только пустые строки, в которых раньше отображался текст в элементах. Сервер, на котором это выполняется, также активно читает из этого файла, но он должен быть только один раз во время выполнения для другого процесса. Кроме того, он по-прежнему печатает правильное количество строк, чтобы показать, что видит правильные значения, как и раньше, и может правильно распечатать эти строки в файле журнала, если это происходит в полном объеме.

Это функция, которая обрабатывает анализ файла:

private HashSet<String> parseFile() throws ProcessingException{
    String fileLocation = getInterfaceLocation();
    HashSet<String> fileMasks = new HashSet<String>();

    try {
        File file = new File(fileLocation);
        BufferedReader br = new BufferedReader(new FileReader(file));

        boolean inFileSet = false;

        String line = "";
        while((line = br.readLine()) != null) {
            if(line.toLowerCase().contains("<fileset")) {
                inFileSet = true;
                continue;
            }
            if(line.toLowerCase().contains("</fileset>")) {
                inFileSet = false;
            }

            if(inFileSet) {
                log(line);
                if(!line.toLowerCase().contains("<include")) {
                    continue;
                }
                else {
                    line = line.substring(line.indexOf("name=") + "name=".length() + 1);
                    line = line.substring(0, line.indexOf("\""));
                    log("Adding mask = ", line);
                    fileMasks.add(line);
                }
            }
        }
        br.close();
    } catch(IOException e) {
        throw new ProcessingException("Unable to open the TESTFILE.xml file",e);
    }
    return fileMasks;
}

А вот соответствующая часть файла XML, которую он анализирует:

<fileset>             
    <include name="filetype1*.csv"/>
    <include name="filetype2*.csv"/>
    <include name="filetype3*.csv"/>
    <include name="filetype4*.csv"/>
    <include name="filetype5*.csv"/>
    <include name="filetype6*.csv"/>
    <include name="filetype7*.csv"/>
    <include name="filetype8*.csv"/>
    <include name="filetype9*.csv"/>
    <include name="filetype10*.csv"/>
    <include name="filetype11*.csv"/>
    <include name="filetype12*.csv"/>
    <include name="filetype13*.csv"/>
    <include name="filetype14*.csv"/>
</fileset>

В моей тестовой среде (Windows 10) я вижу следующий вывод:

<include name="filetype1*.csv"/>
Adding mask = filetype1*.csv
<include name="filetype2*.csv"/>
Adding mask = filetype2*.csv
<include name="filetype3*.csv"/>
...
<include name="filetype14*.csv"/>
Adding mask = filetype14*.csv

И в среде удаленного сервера я получаю:

<include name="filetype1*.csv"/>
Adding mask = 
<include name="filetype2*.csv"/>
Adding mask = 
<include name="filetype3*.csv"/>
...
<include name="filetype14*.csv"/>
Adding mask = 

1 Ответ

2 голосов
/ 15 октября 2019

Следующее должно быть заменой вашего parseFile метода, который использует XPath для поиска искомых данных.

Выражение XPath //include[@name] означает: "дай мне все * 1005"* в документе независимо от местоположения, имеющего атрибут name "

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;

/* Other code here */

private HashSet<String> parseFile()
        throws ProcessingException
{
    String fileLocation = getInterfaceLocation();
    HashSet<String> fileMasks = new HashSet<>();

    File file = new File(fileLocation);

    try {
        // BEGIN: DOM Boilerplate
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        XPathFactory xPathfactory = XPathFactory.newInstance();
        XPath xpath = xPathfactory.newXPath();
        // END: DOM Boilerplate

        Document doc = builder.parse(file);

        XPathExpression includeQuery = xpath.compile("//include[@name]");
        NodeList includes = (NodeList) includeQuery.evaluate(doc, XPathConstants.NODESET);
        for (int i = 0; i < includes.getLength(); i++) {
            Element include = (Element) includes.item(i);
            fileMasks.add(include.getAttribute("name"));
        }
    } catch (Exception e) {
        throw new ProcessingException("Failed to parse file", e);
    }

    return fileMasks;
}
...