为什么java在解析这个XML时会保存空字符串?

KM529

我试图让 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 = 
肖恩·布莱特

以下应该是您parseFile使用 XPath 查找您要查找的数据的方法的替代品

XPath 表达式的//include[@name]意思是:“<include>将文档中的所有内容都给我,而不考虑具有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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Java 8中split有时会在结果数组的开头删除空字符串?

为什么在python中使用re.split()时会得到那些空字符串?

为什么这个假值会转换为空字符串而不是 0?

将空字符串传递给Java枚举.valueOf调用时会产生什么结果?

为什么contains()方法在Java中的非空字符串中找到空字符串

为什么解析空字符串文字时,Parslet(在Ruby中)会返回空数组?

无法保存选定的组合框项,因为 SelectedText 是空字符串。为什么?

为什么将Mono <Void>映射到Mono <String>时会收到一个空字符串?

为什么 s[0] 是 C++ 中空字符串 s 的空字符串?

为什么这个(主要是)空的Perl子例程返回一个空字符串?

在Java中连接空字符串时,在编译和运行时会发生什么?

为什么在尝试在 Java 中拆分字符串时出现空字符串?以及如何修复它?

为什么在JavaScript中不空字符串== null

为什么搜索空字符串这么快?

为什么包含空字符串的列表为真?

为什么tcl认为空字符串是double?

为什么%(Identity)扩展为空字符串?

为什么 glGetProgramInfoLog 返回空字符串?

为什么codecs.iterdecode()吃空字符串?

为什么返回值总是空字符串?

为什么char * foo()返回空字符串?

为什么我从 Xpath 得到空字符串

为什么没有从此Java流中过滤出空字符串?

为什么java.util.Scanner.next()返回空字符串?

为什么Java String.split()留在空字符串后面?

当用C中的空字符截断字符串时会发生什么?

为什么在存储安全字符串时会这样做?

为什么字符串类型的默认值是null而不是空字符串?

为什么在C ++中将字符串引用成员变量设置为空字符串?