首页 > 解决方案 > Java:读取具有动态结构的 XML 文件

问题描述

在我的项目中,我有几个xml具有不同结构的存储库文件。例如:

common.xml

<general>    
    <youTube>https://www.youtube.com/</youTube>     
    <eBay>https://www.ebay.com/</eBay>  
    <trollPic>https://mallofnorway.com/content/uploads/2020/07/008840118.jpg</trollPic>
    <ui>
        <multiValueAtt>Gender</multiValueAtt>
    </ui>
    <api>
        <ownerId>1e1b3a81-8f9a-4126-890a-109694e9fd7c</ownerId>
        <schemaId>4cbacf2e-8f3f-4c0b-9764-d88d302d279f</schemaId>
    </api>
</general>  

partner.xml

<general>
    <ui>
        <partner>
            <schema>
                <multiValueAttr>Gender</multiValueAttr>
            </schema>            
        </partner>
        <member>
            <schema>
                <multiValueAttr>Department</multiValueAttr>
            </schema>            
        </member>
    </ui>
</general>  

我需要创建一个函数来从所有这些文件中获取值。所以我知道我需要将我在该文件中查找的 xml 文件位置和指定的标签名称传递给我的函数,也许还有该标签/字符串的 xml 路径。所以我想方法调用应该看起来像getConfigParam('./some-file.xml', 'ui.partner.schema.multiValueAttr');
我知道如何读取简单xml文件:

static public String objRepository(String fileName, String area, String key){
    try{
        String rootPath = Paths.get(".").toAbsolutePath().normalize().toString();
        String path = rootPath + "\\src\\main\\resources\\repository\\" + fileName + ".xml";
        File file=new File(path);
        DocumentBuilderFactory dbf= DocumentBuilderFactory.newInstance();
        DocumentBuilder db=dbf.newDocumentBuilder();
        Document doc=db.parse(file);
        doc.getDocumentElement().normalize();
        //System.out.println("The node name is: "+doc.getDocumentElement().getNodeName());

        NodeList nList=doc.getElementsByTagName(area);
        //System.out.println("The length is: "+nList.getLength());
        for(int i=0; i<nList.getLength(); i++){
            Node nNode=nList.item(i);
            if(nNode.getNodeType()==Node.ELEMENT_NODE){
                Element ele=(Element) nNode;
                return ele.getElementsByTagName(key).item(i).getTextContent();
            }
        }

    }catch(Exception e){
        e.printStackTrace();
    }
    return "";
}

我也知道如何读取具有常量结构的嵌套xml文件,但我不知道如何xml使用相同的方法读取具有不同结构的嵌套文件。

标签: javaxml

解决方案


你应该看看 XPath。听起来您并不真正关心大部分内容,而只关心一些特定元素(您知道其中的路径)。这意味着您可以简单地以通用方式读取 XML 并使用 XPath 提取您需要的值。以下是关于该主题的优秀(一如既往)Baeldung 文章的示例:

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document xmlDocument = builder.parse(this.getFile());
XPath xPath = XPathFactory.newInstance().newXPath();
String expression = "/Tutorials/Tutorial[@tutId=" + "'" + id + "'" + "]";
node = (Node) xPath.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);

推荐阅读