![](/img/trans.png)
[英]How can I programatically modify an XML Document to respect a DTD in java
[英]How to modify an xml document and return it as a string in 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 捆綁在一起),但有點冗長。
這是使用 XPath API 的解決方案。 在此示例中,元素“Identity”中的所有元素“id”都被刪除(XPath 表達式“//Identity/id”)。 如果要刪除所有 id 元素,請將其更改為“//id”。
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;
// function for XML serialization
public static String serialize(Document document) {
removeWhitespaces(document.getDocumentElement());
try (StringWriter writer = new StringWriter()) {
StreamResult result = new StreamResult(writer);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(document), result);
return writer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// helper function for stripping whitespaces
public static void removeWhitespaces(Element element) {
NodeList children = element.getChildNodes();
for (int i = children.getLength() - 1; i >= 0; i--) {
Node child = children.item(i);
if (child instanceof Text
&& ((Text) child).getData().trim().isEmpty()) {
element.removeChild(child);
} else if (child instanceof Element) {
removeWhitespaces((Element) child);
}
}
}
主要代碼:
// parse XML
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(xml)));
// find id elements
XPathExpression xpath = XPathFactory.newInstance().newXPath().compile("//Identity/id");
NodeList nodes = (NodeList)xpath.evaluate(doc, XPathConstants.NODESET);
// remove found elements
for(int i = 0; i < nodes.getLength(); i ++) {
Node node = nodes.item(i);
node.getParentNode().removeChild(node);
}
// serialize and output document
String result = serialize(doc);
System.out.println(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.