java - java - 如何修改xml文档并在java中将其作为字符串返回?
问题描述
我有这个包含我的请求 xml 的字符串。如果它们存在,我想从这个字符串中删除下面的“id”标签并将其返回。如果可以的话,完全删除“身份”也可以。
To be deleted :
<Identity>
<id extension="7865232" aan = "BUH"/>
<code/>
</Identity>
<Identity>
<id extension="88769032" aan = "DIH"/>
<code/>
</Identity>
String XMLString= "<request version ="1.0">
<minMatch>
<val>100</val>
</minMatch>
<paramList>
<payLoad display = "Full" type="F">
</payLoad>
<IQC code = "2">
</IQC>
<Control display="Default" type = "D">
</Control>
<member>
<memCode code = "Active"
</memCode>
<id extension="12345" aan="ACC"></id>
<id extension="54321" aan="REQ"></id>
<id extension="554376" aan="PDR"></id>
<id extension="66321" aan="NJQ"></id>
<addr use = "H">
<streetLine>123</streetLine>
<city>POLIS</city>
<state>NY</state>
<postalCode>44321</postalCode>
</addr>
<telecom value = "5543213">
</telecom>
<Person>
<name>
<given>JOHN</given>
<family>BILL</family>
</name>
<GenderCode code ="M" display="Male">
</GenderCode>
<birthime vaue="19651002">
</birthime>
<Identity>
<id extensio="7865232" aan = "BUH"/>
<code/>
</Identity>
<Identity>
<id extensio="88769032" aan = "DIH"/>
<code/>
</Identity>
</Person>
</member>
----
---
</request>"
我正在使用下面的代码来实现相同的目的,但它不起作用并且给了我构造函数 DOMSource(Document) 未定义。我厌倦了将文档转换为字节数组,但这也不起作用。有什么方法可以在 Java 1.8 中简单地做到这一点。也欢迎任何其他方法。请建议。谢谢!
public void removeIds(String xmlString){
Document doc = null;
SAXBuilder saxbuilder = new SAXBuilder();
try{
doc = saxbuilder.build(new StringReader(xmlString));
}catch(JDOMException je){
je.printStackTrace();
}catch(IOException ie){
ie.printStackTrace();
}
Element rootNode = doc.getRootElement();
IteratorIterable<Element> rootChildren=rootNode.getDescendants(new ElementFilter("Person"));
for(Element Person:rootChildren){
for(Element Identity:Person.getChildren("Identity")){
((Element) doc.getRootElement.getDescendants(new ElementFilter("Identity"))).removeChild("id");
}
}
try{
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer;
transformer = tf.newTransformer();
// transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
String output = writer.getBuffer().toString();
return output;
} catch (TransformerException e) {
e.printStackTrace();
}
}
解决方案
因为无论如何您都在调用转换,所以在 XSLT 中完成所有工作要比摆弄低级 DOM 操作要简单得多。
如果您使用 XSLT 3.0 (Saxon),那么样式表很简单
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output indent="yes" encoding="utf-8"/>
<xsl:template match="id"/>
</xsl:transform>
您可以将输入提供给此转换,因为new StreamSource(new StringReader(xmlString))
不需要先构造 DOM。
它也可以在 XSLT 1.0 中完成(即使用 Xalan,它与 JDK 捆绑在一起),但有点冗长。
推荐阅读
- javascript - WaveSurfer.js - 同时播放和控制多个音轨
- javascript - 如何从 OMDB API 中检索数据,例如海报、演员等?
- raspberry-pi3 - Raspberry Pi 3 B+ OpenMediaVault 传输速度上限为 11MB/秒
- angular - 使用数据循环折叠区域
- algorithm - Cora-3算法开发气泡指数报警器
- vba - 如何在字符串中插入一个字符?(VBA)
- python - 创建一个能够在一定范围内预测用电量的神经网络
- spring-boot - 基于 Apache Camel 的 Udp 服务器
- sql - 带有 postgresql 的 Rails:从时间中提取字段不起作用
- excel - Delphi Ole - 突然错误 - 不支持接口