java - 从字符串中包含的 XML 的嵌套标记获取值

标签 java xml xpath nodes

我试图从 XML 的嵌套标记中读取值,但遇到了问题。

我的 XML 文件名为 NewFile.xml 我正在尝试读取 tag4 中的值。

<?xml version="1.0"?>
    <tag1>
        <tag2>
            <tag3>
                <tag4>read me</tag4>
            </tag3>
        </tag2>
    </tag1>

这里是一个名为 Test.java 的主类,它读取该 XML 文件并将其转换为字符串,然后将其发送给阅读器类中名为 LookUpValue 的方法。

public class test {

    public static void main(String [] args) throws IOException, XPathExpressionException
    {
        BufferedReader br = new BufferedReader(new FileReader(new File("NewFile.xml")));
        String xmlString;   
        StringBuilder sb = new StringBuilder();

        while((xmlString=br.readLine())!= null){
            sb.append(xmlString.trim());
        }

        xmlString = sb.toString();

        System.out.print(reader.LookUpValue(xmlString));
        br.close();
    }   
}

这是阅读器类和 LookupValue 方法:

import java.io.StringReader;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.xml.sax.InputSource;

public class reader{

    public static String LookUpValue(String sb) throws XPathExpressionException
    {   
        InputSource source = new InputSource(new StringReader(sb));
        XPath xpath = XPathFactory.newInstance().newXPath();
        Object customer = xpath.evaluate("/tag1/tag2/tag3", source, XPathConstants.NODE);
        String value = xpath.evaluate("tag4", customer);

        return ("Value is: " + value);
    }
}

我的问题是,当我运行此程序时,如何读取 tag4 内的值,出现以下错误。

Exception in thread "main" 
javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:365)
    at reader.LookUpValue(LookUpValue.java:21)
    at test.main(test.java:26)
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335)
    ... 5 more
---------
java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:365)
    at reader.LookUpValue(LookUpValue.java:21)
    at test.main(test.java:26)
--------------- linked to ------------------
javax.xml.xpath.XPathExpressionException
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:289)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:365)
    at reader.LookUpValue(LookUpValue.java:21)
    at test.main(test.java:26)
Caused by: javax.xml.transform.TransformerException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:363)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:213)
    at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:275)
    ... 3 more
Caused by: java.lang.RuntimeException: Unable to evaluate expression using this context
    at com.sun.org.apache.xpath.internal.axes.NodeSequence.setRoot(NodeSequence.java:212)
    at com.sun.org.apache.xpath.internal.axes.LocPathIterator.execute(LocPathIterator.java:210)
    at com.sun.org.apache.xpath.internal.XPath.execute(XPath.java:335)
    ... 5 more

最佳答案

import java.io.StringReader;

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

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class Reader {
    public static String lookUpValues(String sb) throws Exception{  

        DocumentBuilder builder = DocumentBuilderFactory
                .newInstance().newDocumentBuilder();
        InputSource src = new InputSource();
        src.setCharacterStream(new StringReader(sb));

        Document doc = builder.parse(src);
        String value = doc.getElementsByTagName("tag4").item(0).getTextContent();
        
        return value;
    }
}

关于java - 从字符串中包含的 XML 的嵌套标记获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39042550/

相关文章:

java - 区分服务器线程(用户连接)

java - 大 XML 文件和 OutOfMemoryError

xml - 将xslt 2.0转换为xslt 1

xpath - MS XML selectNodes 方法未返回预期节点

php - 缓存提要或完成的页面?

java - 从文件夹中读取并更新 XML 标记值

java - 从 Eclipse 推送到 github 时项目丢失

java - MapStruct 无法识别 @Mapping 中的字段 - 简单配置

JavaFx - 在主窗口旁边打开窗口

java - android.view.InflateException : Binary XML file line #0: Error inflating class <unknown> in recyclerview for below API 21