解析xml格式的string内容并修改节点内容

如下解析方式使用了:org.xml.sax.InputSource ;org.w3c.dom.Document ;org.w3c.dom.Element;

缺点:DOM API的缺点之一是消耗大量的内存,因为在该XML文档可以被导航之前,必须创建一个完整的XML文档的内存结构。而SAX API的缺点在于,它实例了一种推分析模型API,其中分析事件是由分析器生成的。比较之下,StAX则是基于一种拉分析模型。

cdaDocument : 是得到的string格式的xml内容;


						StringReader str = new StringReader(cdaDocument);
						InputSource is = new InputSource(str);
						DocumentBuilderFactory factory = DocumentBuilderFactory
								.newInstance();
						DocumentBuilder builder;
						String fileName_pdf = hrid + diid + heventcode + ".pdf";
						builder = factory.newDocumentBuilder();
						Document document = builder.parse(is);
						Element rootElement = document.getDocumentElement();
						// start
						NodeList list1 = rootElement
								.getElementsByTagName("text");
						for (int i = 0; i < list1.getLength(); i++) {
							Element element = (Element) list1.item(i);
							String mediaType = element
									.getAttribute("mediaType").toString()
									.trim();
							if (mediaType != null && !"".equals(mediaType)) {
								if ("application/pdf".equals(mediaType)) {
									NodeList list = rootElement
											.getElementsByTagName("reference");
									Element elementRef = (Element) list.item(i);
									String brandName1 = elementRef
											.getAttribute("value").toString()
											.trim();
									BASE64Decoder base64Decoder = new BASE64Decoder();
									byte[] data = base64Decoder
											.decodeBuffer(brandName1);
									byte[] Buffer = new byte[1024];
									int size = 0;
									try {
										String directory_pdf = getWebRoot()
												.substring(1).replaceAll("//",
														File.separator)
												+ "cdapdf"
												+ File.separator
												+ connectIp + File.separator;
										BufferedInputStream bis = new BufferedInputStream(
												new ByteArrayInputStream(data));
										// FileOutputStream fos1 = new
										// FileOutputStream
										// ("D:\\copyjava11.pdf") ;
										FileOutputStream fos1 = new FileOutputStream(
												directory_pdf + fileName_pdf);
										BufferedOutputStream bos1 = new BufferedOutputStream(
												fos1, 1024);

										while ((size = bis.read(Buffer)) != -1) {
											bos1.write(Buffer, 0, size);
										}
										bos1.flush();
										bos1.close();
										fos1.close();
										bis.close();
									} catch (Exception e) {
										log.debug("存储PDF流操作失败:"
												+ e.getMessage());
									}
									// 成功end
									// 修改属性值
									elementRef.setAttribute("value", "cdapdf\\"
											+ connectIp + "\\" + fileName_pdf);
								} else {
									NodeList list = rootElement
											.getElementsByTagName("reference");
									Element elementRef = (Element) list.item(i);
									// 修改属性值
									elementRef.setAttribute("value", "");
								}
							}

						}
						TransformerFactory transformerFactory = TransformerFactory
								.newInstance();
						Transformer transformer = transformerFactory
								.newTransformer();
						DOMSource domSource = new DOMSource(document);
						ByteArrayOutputStream baos = new ByteArrayOutputStream();
						// 设置编码类型
						transformer.setOutputProperty(OutputKeys.ENCODING,
								"GB2312");
						transformer
								.transform(domSource, new StreamResult(baos));
						cdaDocument = baos.toString();
					


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,我可以给出以下的示例代码来解析 XML 并获取指定节点内容: ```java import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XmlParser { public static void main(String[] args) { try { File inputFile = new File("input.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("book"); // 获取所有名为 "book" 的节点 for (int i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; String title = eElement.getElementsByTagName("title").item(0).getTextContent(); // 获取名为 "title" 的节点内容 System.out.println("Title: " + title); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们首先创建了一个 `DocumentBuilderFactory` 和一个 `DocumentBuilder` 对象,然后使用 `parse` 方法将 XML 文件解析为 `Document` 对象。接着,我们通过调用 `getElementsByTagName` 方法获取名为 "book" 的所有节点,然后遍历这些节点,对于每个节点,我们通过调用 `getElementsByTagName` 获取名为 "title" 的节点,再通过调用 `getTextContent` 方法获取该节点内容。 当然,上面的代码只是一个简单的示例,实际应用中可能会涉及到更复杂的 XML 结构和更多的节点操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值