简体   繁体   English

使用Xpath读取节点列表

[英]Reading List of Node using Xpath

this is my XML file : 这是我的XML文件:

<sitemesh>
    <mapping path="/editor/tempPage/**" exclude="true"/>

        <mapping decorator="/WEB-INF/views/decorators/detailstheme.jsp"
            path="/*" exclude="false" />

    </sitemesh>

I want list of mapping node with their attribute values. 我想要映射节点的列表及其属性值。 this should be done using Xpath. 这应该使用Xpath完成。

my xpath expression is : 我的xpath表达式是:

expr = xpath.compile("/sitemesh/mapping");

but i am getting null in nodelist. 但我在nodelist中得到null。

this is my code: 这是我的代码:

Map<String,String> map=new HashMap<String, String>();

        // reading xml file
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        Document doc = null;
        XPathExpression expr = null;
        try {
            builder = factory.newDocumentBuilder();
            // creating input stream
            doc = builder.parse(file);
            XPathFactory xpf = XPathFactory.newInstance();
            XPath xpath = xpf.newXPath();
            expr = xpath.compile("//mapping");
        } catch (Exception e) {
            LOG.error("some exception message", e);
        }


        //------------------------------------------------------------------------

        NodeList attributeElements = null;
        try {
            attributeElements =(NodeList)expr.evaluate(doc, XPathConstants.NODE);

        } catch (XPathExpressionException e) {
            LOG.error("some exception message", e);
        }
        System.out.println("lenght:"+attributeElements.getLength());
        for (int i = 0; i < attributeElements.getLength(); i++) {
                Node node=attributeElements.item(i);
                System.out.println("node:"+node.getNodeValue());
             NamedNodeMap attrs = node.getAttributes();  
              for(i = 0 ; i<attrs.getLength() ; i++) {
                Attr attribute = (Attr)attrs.item(i);  
                System.out.println("Node Attributes : " + attribute.getName()+" = "+attribute.getValue());
              }
        }


        //-------------------------------------------------------------------------

        // writing xml file
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer;
        try {
            transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult(file);// creating output
                                                            // stream
            transformer.transform(source, result);
        } catch (Exception e) {
            LOG.error("some exception message", e);
        }

        return   map;

i am getting null for attributeElements 我为attributeElements获取null

i want to show values of path,decorator and exclude on JSP page.But i am unable to get list of node through xpath expression. 我想在JSP页面上显示路径,装饰器和排除的值。但是我无法通过xpath表达式获取节点列表。

I want solution for reading mapping node element in Xpath. 我想要在Xpath中读取mapping节点元素的解决方案。

[edit] /sitemesh/mapping also works . [edit] / sitemesh / mapping也有效。

The issue here is that you evaluating the express for XPathConstants.NODE while the nodeList maps to XPathConstants.NODESET . 这里的问题是您在nodeList映射到XPathConstants.NODESET时评估XPathConstants.NODE的express。 please refer below link. 请参考以下链接。

http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/xpath/XPathConstants.html#NODESET http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/xpath/XPathConstants.html#NODESET

Added sample code for illustration purpose only: 添加示例代码仅用于说明目的:

public void testXpathExpr(){

String testXML = "<sitemesh><mapping path=\"/editor/tempPage/**\" exclude=\"true\"/><mapping decorator=\"/WEB-INF/views/decorators/detailstheme.jsp\" path=\"/*\" exclude=\"false\" /></sitemesh>";

NodeList nodeList = getNodeList(testXML);
}

private NodeList getNodeList(String xml) throws SAXException, IOException, ParserConfigurationException, XPathExpressionException {
  DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = docFactory.newDocumentBuilder();

  document = builder.parse(new ByteArrayInputStream( xml.getBytes() ) );
  XPathExpression exprPath = xpath.compile(xpathExpr);
  NodeList nodeList = (NodeList) exprPath.evaluate(document, XPathConstants.NODESET);;
return nodeList;
}

Hope this helps! 希望这可以帮助!

Your xpath works perfectly for me. 你的xpath非常适合我。 Below is the sample code: 以下是示例代码:

public class Parser {

    public static void main(String[] args) throws Exception, Exception {
        final DocumentBuilderFactory factory = DocumentBuilderFactory
                .newInstance();
        final DocumentBuilder builder = factory.newDocumentBuilder();
        final Document doc = builder.parse("src/sitemesh.xml");
        final XPathFactory xPathfactory = XPathFactory.newInstance();
        final XPath xpath = xPathfactory.newXPath();
        final XPathExpression expr = xpath.compile("/sitemesh/mapping");
        Object node = expr.evaluate(doc, XPathConstants.NODE);

        System.out.println(node);
    }
}

sitemesh.xml contains your sample input. sitemesh.xml包含您的示例输入。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM