返回Java中EvaluatePath缺失标记的空值

返回Java中EvaluatePath缺失标记的空值,java,arrays,xpath,xpath-2.0,xpath-1.0,Java,Arrays,Xpath,Xpath 2.0,Xpath 1.0,我正在通过评估路径检索XML标记值,假设我有3个带有图书信息的标记: 图书信息包括:Name-year-Author和in 1标记Author Name已丢失且不在我的标记中,我希望有一个数组显示1 Author Name+null值,该数组显示2个标记尚未指定,如下所示: 如您所见,第二个标记没有作者姓名,第三个标记没有任何作者姓名标记,如下所示: 非常感谢您的指导/提示/帮助。:-) 作者: [约翰·史密斯,零,零] 我的XML文件: <?xml version="1.0" encod

我正在通过评估路径检索XML标记值,假设我有3个带有图书信息的标记: 图书信息包括:Name-year-Author和in 1标记Author Name已丢失且不在我的标记中,我希望有一个数组显示1 Author Name+null值,该数组显示2个标记尚未指定,如下所示: 如您所见,第二个标记没有作者姓名,第三个标记没有任何作者姓名标记,如下所示: 非常感谢您的指导/提示/帮助。:-)

作者: [约翰·史密斯,零,零]

我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<perldata>
    <item key="book">
        <item key="name">My Book Name</item>
        <item key="year">2019</item>
        <item key="author">John Smith</item>
    </item>
    <item>
        <item key="name">Anonymous Book Name 1</item>
        <item key="year">2018</item>
        <item key="author"></item>
    </item>
    <item>
        <item key="name">Her Book Name</item>
        <item key="year">2018</item>
    </item>
</perldata>

我的书名
2019
约翰·史密斯
匿名书名1
2018
她的书名
2018
这表明第三个标签不包含作者姓名标签。 我不知道如何在EvaluatePath中显示空值:(真的需要帮助)

stringfilename=“book.xml”;
Document Document=getDocument(文件名);
//定义变量
//字符串xpathExpression=“”;
FileWriter fw=null;
BufferedWriter bw=null;
PrintWriter pw=null;
//使用文档生成器
DocumentBuilderFactory DocumentBuilderFactory=DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder DocumentBuilder=documentBuilderFactory.newDocumentBuilder();
Document doc1=documentBuilder.parse(文件名);
/*******使用xpath获取属性值******/
XPathFactory XPathFactory=XPathFactory.newInstance();
XPath=xpathFactory.newXPath();
试一试{
fw=newfilewriter(“/root/Desktop/book.txt”);
bw=新的缓冲写入程序(fw);
pw=新的PrintWriter(bw)
println(“BookName:+evaluateXpath(document,“/perldata/item[@key=book]/item[@key='name']]/text()”);
println(“年份:”+evaluateXpath(文档,“/perldata/item[@key=book]/item[@key='year']]/text()”)
println(“作者:”+evaluateXpath(文档,“/perldata/item[@key=book]/item[@key='Author']]/text()”)
pw.flush();}
捕获(IOE异常)
{e.printStackTrace();}}}
私有静态列表evaluateXPath(文档、字符串xpathExpression)引发异常
{
//创建XPathFactory对象
XPathFactory XPathFactory=XPathFactory.newInstance();
//创建XPath对象
XPath=xpathFactory.newXPath();
列表值=新的ArrayList();
尝试
{
//创建XPathExpression对象
XPathExpression expr=xpath.compile(XPathExpression);
//计算XML文档上的表达式结果
NodeList节点=(NodeList)expr.evaluate(文档,XPathConstants.NODESET);
对于(int i=0;i
摘要

修剪标记的文本内容,并检查结果字符串是否为空

详细信息

问题中的XML只有一个包含
key=“book”
的标记。我假设所有三个部分都应该有这个,所以我们知道每个部分代表一本书

因此,我假设您有一个如下所示的XML文件,其中包括一个空的“author”标记和一个完全缺失的“author”标记:

最终打印声明给出了以下内容:

[John Smith, null, null, Jane Jones]
附加说明:

这将遍历文件中的所有
部分。对于每个部分,它将执行此目标搜索,但仅限于该部分:

evaluate
使用当前的
bookNode
作为其起点

之后,我们可以检查所有可能的结果:

  • 我们找到了一个
    key=“author”
    标记,其中包含作者的姓名
  • 我们找到了一个
    key=“author”
    标签,但里面没有名字
  • book
    节点没有
    key=“author”
    标记

我已经将我的XML文件放在第三个标记中,以便进一步说明,正如您在第三个标记中看到的,我也没有作者姓名。我怎样才能得到作者:[John Smith,null,null]作为结果?@CodeGirl-好的-根据您的示例进行更新-但请参阅我关于
key=“book”
的说明。希望这个修改后的方法有帮助!我不敢相信它真的有用!!非常感谢你与我分享的时间。
<?xml version="1.0" encoding="UTF-8"?>
<perldata>
    <item key="book">
        <item key="name">My Book Name</item>
        <item key="year">2019</item>
        <item key="author">John Smith</item>
    </item>
    <item key="book">
        <item key="name">Anonymous Book Name 1</item>
        <item key="year">2018</item>
        <item key="author"></item>
    </item>
    <item key="book">
        <item key="name">Her Book Name</item>
        <item key="year">2018</item>
    </item>
    <item key="book">
        <item key="name">Another Book Name</item>
        <item key="year">2019</item>
        <item key="author">Jane Jones</item>
    </item>
</perldata>
File file = new File("C:/tmp/Book2.xml");
FileInputStream fis = new FileInputStream(file);
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(fis);
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList bookNodes = (NodeList) xPath.compile("//item[@key='book']")
        .evaluate(xmlDocument, XPathConstants.NODESET);

List<String> authors = new ArrayList();

for (int i = 0; i < bookNodes.getLength(); i++) {
    Node bookNode = bookNodes.item(i);
    Node authorNode = (Node) xPath.compile("./item[@key='author']")
            .evaluate(bookNode, XPathConstants.NODE);

    if (authorNode == null) {
        authors.add(null);
    } else {
        String s = authorNode.getTextContent().trim();
        authors.add(s.isEmpty() ? null : s);
    }
}
System.out.println(authors);
[John Smith, null, null, Jane Jones]
Node authorNode = (Node) xPath.compile("./item[@key='author']")
        .evaluate(bookNode, XPathConstants.NODE);