java - 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
使用相同的方法读取具有不同结构的嵌套文件。
解决方案
你应该看看 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);
推荐阅读
- javascript - Gatsy 中的导航函数返回未定义
- google-apps-script - UrlFetchApp.fetch(URL).getContentText() 突然无法正常工作,尽管没有任何变化
- python - 如何显示作者的 Discord 标签
- javascript - 从javascript获取麦克风输入并用python处理输出,所以我可以将它部署在heroku上
- c++ - VS Code 中增强的 C++ 注释:混合 Doxygen 和本机功能的问题
- python - Linux 不支持使用 pyodbc 和 CODEPAGE 的转换错误
- c - 如何通过 UDP 发送结构并在另一端接收?
- c# - 有没有一种简单的方法可以从数据库中获取特定的列数据
- javascript - 这两种制作二维矩阵的方法有什么区别?
- python - 无法在 CentOS 7 中安装 mysqlclient