java获取xml里的标签及内容或者获取标签内的文本内容

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

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

public class XmlAnalysis {
    private String xml; // XML 字符串
    private String ProductContent; // <Product> 标签内容
    private String ProjectInfoContent; // <ProjectInfo> 标签内容

    public XmlAnalysis(String xml) {
        this.xml = xml;
        ProductContent = "";
        ProjectInfoContent = "";

        // 创建 DOM 解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        try {
            // 创建 DOM 解析器
            DocumentBuilder builder = factory.newDocumentBuilder();

            // 将 XML 字符串转换为输入流
            ByteArrayInputStream input = new ByteArrayInputStream(xml.getBytes());

            // 解析输入流,得到文档对象模型(DOM)
            Document document = builder.parse(input);

            // 获取 <Product> 标签
            NodeList productNodeList = document.getElementsByTagName("Product");

            // 遍历节点列表,取出每个 <Product> 标签及其内容
            for (int i = 0; i < productNodeList.getLength(); i++) {
                Element element = (Element) productNodeList.item(i);
                String content = getNodeAsString(element); // 获取标签及其内容
                String content = element.getTextContent(); // 获取标签内的文本内容
                ProductContent += content;
                System.out.println("<Product>: " + content);
            }

            // 获取 <ProjectInfo> 标签
            NodeList projectInfoNodeList = document.getElementsByTagName("ProjectInfo");

            // 遍历节点列表,取出每个 <ProjectInfo> 标签及其内容
            for (int i = 0; i < projectInfoNodeList.getLength(); i++) {
                Element element = (Element) projectInfoNodeList.item(i);
                String content = getNodeAsString(element);
                String content = element.getTextContent(); // 获取标签内的文本内容
                ProjectInfoContent += content;
                System.out.println("<ProjectInfo>: " + content);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String getNodeAsString(Element element) {
        StringBuilder builder = new StringBuilder();

        // 开始标签
        builder.append("<").append(element.getTagName()).append(">");

        // 处理子节点
        NodeList childNodes = element.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            builder.append(nodeToString(childNodes.item(i)));
        }

        // 结束标签
        builder.append("</").append(element.getTagName()).append(">");

        return builder.toString();
    }

    private String nodeToString(org.w3c.dom.Node node) {
        StringBuilder builder = new StringBuilder();

        // 文本节点
        if (node.getNodeType() == org.w3c.dom.Node.TEXT_NODE) {
            builder.append(node.getNodeValue());
        }

        // 元素节点
        else if (node.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) {
            Element element = (Element) node;
            builder.append(getNodeAsString(element));
        }

        return builder.toString();
    }

    public String getProductContent() {
        return ProductContent;
    }

    public String getProjectInfoContent() {
        return ProjectInfoContent;
    }

    // 测试示例
    public static void main(String[] args) {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><TestProjectInfo><Products><Product><Model>XXX(XX)</Model></Product><Product><Model>XXX(XX)</Model><TuHao>hq10</TuHao><CpName>HQ-10</CpName><CpCode>Z06-TEST01</CpCode><BatchCode>Z06</BatchCode><DaiHao /><BanBen>/</BanBen></Product></Products><ProjectList><ProjectInfo><ProjectTestInfo><ID></ID><Name>装配准备</Name><Code></Code><Gongxh>10</Gongxh><OldGongxh>12</OldGongxh><GongxName>装配准备</GongxName><ProcVersion>A.6</ProcVersion><TechDoc>XM07.01-001</TechDoc><PlanBeginDate>2023-03-31 12:00:00</PlanBeginDate><PlanEndDate>2023-03-31 12:00:00</PlanEndDate><RealStartTime>2023-04-01 12:00:00</RealStartTime><RealEndTime>2023-04-02 12:00:00</RealEndTime><TaskSendTime>2023-04-03 12:00:00</TaskSendTime><Stage>Z</Stage><FuZeRen>shixiao</FuZeRen><CaoZuoRen>houenwei</CaoZuoRen><Status></Status><Miji></Miji><Sycd></Sycd><Xqbm>光导部</Xqbm><Czbm>光导部</Czbm><WorkCenter>光学导航与探测事业部</WorkCenter><Intention></Intention><Note></Note><TestBrief></TestBrief><TaskBook></TaskBook><TbomId></TbomId><Kzxx></Kzxx><Documents><Document><FileID>http://10.122.254.25:9000/otatest/10_ZLJL2303030001_A.6_20230403_145319977.json</FileID><FileName>30_ZLJL2304010005_B.8_20230401_184543851.json</FileName></Document></Documents></ProjectTestInfo><CanYuRens><CaoZuoRen>houenwei</CaoZuoRen></CanYuRens></ProjectInfo></ProjectList></TestProjectInfo>";


        XmlAnalysis xmlAnalysis = new XmlAnalysis(xml);
        String productContent = xmlAnalysis.getProductContent();
        String projectInfoContent = xmlAnalysis.getProjectInfoContent();

        System.out.println("Product Content: " + productContent);
        System.out.println("ProjectInfo Content: " + projectInfoContent);
    }
}


 

 

 

<think>嗯,用户想了解如何使用Java解析XML获取内容。好的,首先我得回忆一下Java中处理XML的主要方法。常见的应该有DOM、SAX、StAX,还有JDOM和DOM4J这些第三方库。不过现在可能更多人用DOM或者SAX,或者像JAXB这样的数据绑定方式? 首先,我需要确定用户的基础水平。可能用户是刚开始学Java,需要基础的解析方法。DOM和SAX是Java标准库自带的,不需要额外依赖,适合简单的情况。DOM会把整个XML加载到内存,形成树结构,适合小文件。SAX是基于事件驱动的,逐行读取,适合大文件,但编程稍微复杂些。 然后,用户可能需要具体的代码示例。先介绍DOM方法吧。步骤大概是:创建DocumentBuilderFactory,然后DocumentBuilder,解析文件得到Document对象,然后遍历节点。比如获取根元素,然后遍历子节点,提取标签名和内容。 然后是SAX方法,需要继承DefaultHandler,重写startElement、characters、endElement等方法。这需要处理标签内容的拼接,可能代码稍微复杂,但内存效率高。 另外,可能用户听说过DOM4J或者JDOM,这些库更简洁,但需要引入外部jar包。比如DOM4J的API更友好,使用XPath查询方便。不过如果用户的项目不允许第三方库,可能需要用标准库。 不过用户的问题可能更倾向于标准方法,所以先重点介绍DOM和SAX。同时,可能需要提到XPath,因为有时候提取特定节点很方便。比如在DOM中使用XPath可以快速定位节点,避免手动遍历。 然后,注意代码示例的正确性。比如DocumentBuilderFactory.newInstance()可能抛异常,需要处理。还有,遍历子节点时要注意不同的节点类型,比如文本节点和元素节点,可能需要过滤。 可能用户会遇到问题,比如如何获取属性或者处理命名空间。这时候可以补充说明,比如element.getAttribute("属性名"),或者在DOM4J中使用attributeValue方法。 另外,提醒用户注意异常处理,比如ParserConfigurationException和SAXException,还有IOException。在示例中可以用try-catch块包裹。 总结来说,步骤应该是: 1. 介绍主要解析方法:DOM、SAX、StAX、JAXB、第三方库。 2. 详细说明DOM解析步骤,附代码示例。 3. 详细说明SAX解析步骤,附代码示例。 4. 简要介绍DOM4J或JDOM的使用,如果有必要。 5. 可能提到XPath的应用。 6. 注意事项,比如异常处理、节点类型判断等。 需要检查代码是否正确,比如DOM解析中获取子节点时,node.getNodeType() == Node.ELEMENT_NODE是否正确。还有,SAX示例中的标签名和内容拼接是否正确。 可能用户会问性能问题,所以需要比较DOM和SAX的优缺点。DOM适合小文件,方便操作;SAX适合大文件,内存占用低。 另外,提到Java的XPathFactory的使用,可以在DOM解析后使用XPath查询,例如: XPath xpath = XPathFactory.newInstance().newXPath(); String value = xpath.evaluate("//book/title", document); 这样可以简化节点查找。 最后,确保回答结构清晰,分步骤说明,代码示例正确,语法正确,使用中文,并且符合用户的需求。</think>在Java中解析XML获取内容主要有以下几种方式,以下分步骤说明并附示例代码: 一、DOM解析(适合小文件) $$优点:\ 内存树结构操作方便$$ 1. 创建DocumentBuilder ```java DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); ``` 2. 解析XML文件 ```java Document document = builder.parse(new File("data.xml")); document.getDocumentElement().normalize(); ``` 3. 获取节点内容 ```java NodeList nodeList = document.getElementsByTagName("book"); for (int i=0; i<nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); String title = element.getElementsByTagName("title") .item(0).getTextContent(); System.out.println("书名:" + title); } ``` 二、SAX解析(适合大文件) $$优点:\ 事件驱动内存占用低$$ 1. 自定义Handler ```java class MyHandler extends DefaultHandler { private StringBuilder currentValue = new StringBuilder(); public void startElement(String uri, String lName, String qName, Attributes attrs) { currentValue.setLength(0); } public void characters(char[] ch, int start, int length) { currentValue.append(ch, start, length); } public void endElement(String uri, String lName, String qName) { if ("title".equals(qName)) { System.out.println("书名:" + currentValue.toString().trim()); } } } ``` 2. 执行解析 ```java SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse(new File("data.xml"), new MyHandler()); ``` 三、DOM4J解析(第三方库更高效) 需引入dom4j-2.1.3.jar ```java SAXReader reader = new SAXReader(); Document document = reader.read(new File("data.xml")); List<Node> nodes = document.selectNodes("//book/title"); for (Node node : nodes) { System.out.println("书名:" + node.getText()); } ``` 四、XPath快速定位(需结合DOM使用) ```java XPath xpath = XPathFactory.newInstance().newXPath(); NodeList nodes = (NodeList) xpath.evaluate( "//book[price>30]/title", document, XPathConstants.NODESET ); ``` 注意事项: 1. 异常处理:必须捕获`ParserConfigurationException`, `SAXException`, `IOException` 2. 节点类型判断:使用`node.getNodeType() == Node.ELEMENT_NODE` 3. 性能选择:>100MB文件建议使用SAX或StAX 示例XML结构: ```xml <library> <book> <title>Java编程思想</title> <price>89.00</price> </book> </library> ``` 根据具体需求选择方案: - 需要随机访问选DOM - 大数据量用SAX - 复杂查询用DOM4J+XPath - Java11+推荐使用JAXB进行对象绑定(需要XSD)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值