Java使用DOM加载XML文件

使用DOM加载XML文件

在网上看了几篇关于java加载XML文件的做法,感觉都比较简单,对工具类的使用也比较少,刚好项目中碰到了加载XML的问题,在此记录以下。

XML文件样式

这个XML文件是有三层标签的,基本上业务不复杂就够用了。

<interface>
    <!-- 运行状态 -->
    <object nTypeId="802" cTypeId="8020000000119" pTypeId="4996" layer="LR_Encapsulation" layerParameter="OperateStatus">
        <resource resType="OTN_A_PG8_PORT_CONFIG2" resProperty="ETH_LINK_STATUS" />
    </object>
    <!-- MAC地址 -->
    <object nTypeId="802" cTypeId="8020000000119" pTypeId="4996" layerRate="LR_Ethernet" layerParameter="PhysAddress">
        <resource resType="RCMACSEARCHSHOWTABLE" resProperty="MAC_ADDRESS" />
    </object>
</interface>    

java代码

代码只写了关键部分,主要是怎样加载XML文件以及解析xml,怎么提取配置的属性。至于怎么处理,根据具体业务具体分析。

import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.springframework.stereotype.Component;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;




//使用ClassLoader加载XML文件进内存
private static URL getXmlFileURLByName(String fileName, ClassLoader classLoader) {
        ClassLoader urlclassloader = classLoader;
        URL url = urlclassloader.getResource(fileName);
        if (url == null) {
            log.error("Cannot find xml file [" + fileName + "].");
            throw new NullPointerException();
        }
        return url;
    }

//将XML解析成Document对象
 private static Document parseXml2Document(@NotNull URL url) {
        DocumentBuilderFactory documentbuilderfactory = DocumentBuilderFactory.newInstance();
        documentbuilderfactory.setNamespaceAware(true);
        documentbuilderfactory.setCoalescing(true);
        try {
            DocumentBuilder documentbuilder = documentbuilderfactory.newDocumentBuilder();
            return documentbuilder.parse(url.openStream());
        } catch (SAXException | IOException | ParserConfigurationException e) {
            log.error("Fail to decode the file : " + url.toString() + " , the exception is : " + e.getMessage());
        }
        return null;
    }

 //Document对象是一个树结构,类似于前端里说的dom树,我们首先要做的事取到根节点。
 String filePath = "XML路径";//classLoader有很多获取方式,任意都可以。
 ClassLoader classLoader = this.getClass().getClassLoader();
 URL url = getXmlFileURLByName(filePath, classLoader);
 Document doc = parseXml2Document(url);
 //获取根节点
 if (doc != null) {
     Node node = doc.getDocumentElement();
 }

 //注意,下面都是核心操作代码,关于如何取属性的,业务不相干。都是一些散的代码。可能有些{}对不上
 //node是根节点(interface),获取它的所有子节点
 if(node.hasChildNodes()) {
            NodeList nodeList = node.getChildNodes();
            for(int i=0, len=nodeList.getLength(); i < len; ++i) {
            	//<object>节点
                Node childNode = nodeList.item(i);
                //这是dom自定义的,用于判断是不是一个元素类型的。getNodeName()可以获取节点名“object”
                short nodeType = childNode.getNodeType();
                if(nodeType == Node.ELEMENT_NODE && childNode.getNodeName().equalsIgnoreCase("object")) {
					 // read object获取此标签中的属性
					 NamedNodeMap namednodemap = childNode.getAttributes();
 					 if (namednodemap != null) {
     					for (int i = 0, len=namednodemap.getLength(); i < len; ++i) {
        					 Attr attr = (Attr) namednodemap.item(i);
        					 if(attr.getNodeName().equalsIgnoreCase("nTypeId")) {
					             nTypeId = attr.getNodeValue();
        					 }else if(attr.getNodeName().equalsIgnoreCase("cTypeId")) {
            					 cTypeId = attr.getNodeValue();
        					 }else if(attr.getNodeName().equalsIgnoreCase("pTypeId")){
            					 pTypeId = attr.getNodeValue();
       						 }else if(attr.getNodeName().equalsIgnoreCase("layer")){
             					layer = attr.getNodeValue();
         					}else if(attr.getNodeName().equalsIgnoreCase("layerParameter")){
             					layerParameter = attr.getNodeValue();
         					}
     					}
  					}
				

					 // read resource获得<resource>里面的属性
       				if (node.hasChildNodes()) {
           			 NodeList nodeList = node.getChildNodes();
           			 for(int k=0, listLen=nodeList.getLength(); k < listLen; ++k) {
			                Node childNode = nodeList.item(k);
            			    short nodeType = childNode.getNodeType();
            			    if(nodeType == Node.ELEMENT_NODE && childNode.getNodeName().equalsIgnoreCase("resource")) {
               			     NamedNodeMap childnodemap = childNode.getAttributes();
                  			  if (childnodemap != null) {
			                        for (int j = 0, len=childnodemap.getLength(); j < len; ++j) {
                        			    Attr attr = (Attr) childnodemap.item(j);
                        			    if(attr.getNodeName().equalsIgnoreCase("resType")) {
                           			     resType = attr.getNodeValue();
                        			    }else if(attr.getNodeName().equalsIgnoreCase("resProperty")) {
                              			  resProperty = attr.getNodeValue();
                          			    }
                   			        }
               			      }
                			  break;
               			    }
           			 }
      			
				
       			 }
                    
                }
            }
        }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用dom4j解析xml文件可以通过以下步骤完成: 1. 加载xml文件,可以使用以下代码: ``` DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("file.xml")); ``` 2. 获取根节点,使用以下代码: ``` Element root = doc.getRootElement(); ``` 3. 遍历子节点,使用以下代码: ``` List<Element> childList = root.elements(); for (Element child : childList) { //对子节点进行操作 } ``` 4. 获取节点属性,使用以下代码: ``` String attributeValue = element.attributeValue("attributeName"); ``` 5. 获取节点值,使用以下代码: ``` String value = element.getText(); ``` ### 回答2: Java是一种流行的编程语言,在处理XML文件时,有很多的库可供选择。dom4j则是其的一种库,它是一种同步、线程安全的XML解析器,拥有高效、灵活、简单的API。 dom4j解析XML文件分为以下步骤: 1. 创建SAXReader对象,它是dom4j解析器的核心类。 2. 调用SAXReader对象的read()方法,通过文件输入流读取XML文件内容并将其转换成一个Document对象。 3. 从Document对象取到根元素(root element)。 4. 从根元素开始递归遍历所有子元素,获取特定元素的值或属性,修改元素的值或属性。 下面对以上步骤进行详细说明: 1. 创建SAXReader对象 SAXReader对象是dom4j解析器的核心对象,要解析XML文件,需要先创建该对象。创建SAXReader对象的代码如下: SAXReader reader = new SAXReader(); 2. 解析XML文件 要解析XML文件,需要调用SAXReader对象的read()方法,并传入要解析的XML文件名或者文件输入流。代码示例如下: Document document = reader.read(new File("test.xml")); 3. 获取根元素 解析完成后,需要获取XML文件的根元素(即文档的最外层标签)。获取根元素的代码如下: Element root = document.getRootElement(); 4. 遍历所有子元素 获取根元素之后,可以通过遍历所有子元素来获取需要的元素、属性或者修改元素内容。遍历子元素的代码如下: List<Element> elements = root.elements(); for(Element element : elements) { // 对元素进行处理 } dom4j除了上述基本步骤外,还提供了更多的API和工具类,方便我们在XML文件处理过程进行元素的增删改查、元素内容的验证和转换等操作。总的来说,dom4j是一种易用、灵活的XML解析器,广泛应用于Java开发领域。 ### 回答3: DOM4J是Java语言的一种XML文档操作工具包,它可以方便地对XML文档进行创建、读取、修改、查询及输出等操作。使用DOM4J解析XML文件可以方便地从XML文件读取数据、进行数据处理,并将处理的数据保存到指定的文件或数据源。 在使用DOM4J解析XML文件时,我们首先需要通过文档工厂类创建DOM4J的文档对象,然后就可以通过该文档对象获取XML文档的根节点,并对其进行遍历操作。 在遍历XML文档时,我们可以通过getElement()方法获取指定节点的子节点或属性节点,并通过getText()方法获取节点的文本内容。同样地,我们也可以使用XPath表达式来获取指定节点的数据。 除了读取XML文件,我们还可以使用DOM4J创建和修改XML文件。在创建XML文件时,我们可以通过创建根节点和子节点来构建整个XML文档,并使用输出流将其保存到指定位置。在修改XML文件时,我们可以通过获取指定节点并修改其内容来对XML文档进行更新。 总的来说,DOM4J是一种强大的XML文档操作工具包,它不仅提供了丰富的API函数,还支持XPath表达式和XSLT样式表,使得我们可以方便地对XML文档进行操作和处理。通过学习DOM4J,我们可以更好地掌握Java语言XML文档的读取、创建和修改等技术,从而更好地开发出高质量的Java应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值