在 DOm java 中获取嵌套的 xml 文档
Get nested xml document in DOm java
我想做什么? - 我正在尝试将下面 xml 中的 InputData 文档提取为 XML(而不是元素的 textContent ).
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Identifier>1</Identifier>
<Mode>SYNCHRONOUS</Mode>
<Callback>null</Callback>
<InputData>
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
</InputData>
</Test>
当我执行 node.item(i).textContent() 时,我希望输出为:
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
问题代码是什么? -
private void doProcessing(Document xmldoc) {
Element rootEliment = xmldoc.getDocumentElement();
// System.out.println("NodeName : "+rootEliment.getNodeName());
NodeList children = rootEliment.getChildNodes();
NamedNodeMap nnl = rootEliment.getAttributes();
Node inputdata = nnl.getNamedItem("InputData");
// inputdata.getOwnerDocument().g
// System.out.println("inputDataValuefirst: "+inputdata.getTextContent());
// NodeList testList = xmldoc.getElementsByTagName("InputData");
for (int i = 0; i < children.getLength(); i++) {
// Element el = (Element)children.item(i);
//System.out.println("NodeName: " + children.item(i).getNodeName()
// + " TextValue: " + children.item(i).getTextContent());
if (children.item(i).getNodeName() == "InputData") {
NodeList childs = children.item(i).getChildNodes();
for (int j = 0; j < childs.getLength(); j++) {
System.out.println("NodeVal;ue: "
+ childs.item(j).getNodeName() + " Text: "
+ childs.item(j).getTextContent());
}
}
}
}
给我:
节点值;ue:iid 文本:pp1
我也尝试过其他各种组合。它们都给出了子节点的 textContent 而不是节点本身。我怎样才能做到这一点?
使用 LSSerializer
.
将您的 <iid>
节点序列化为字符串
try {
NodeList childNodes = xmldoc.getDocumentElement().getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
if ("InputData".equals(node.getNodeName())) {
Node iid = node.getFirstChild();
while (!"iid".equals(iid.getNodeName())) {
iid = iid.getNextSibling();
}
String iidTree = ((DOMImplementationLS) xmldoc
.getImplementation()).createLSSerializer()
.writeToString(iid);
System.out.println(iidTree.replaceFirst("<.*?>\n", "")
.replaceAll("[ ]", ""));
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
输出:
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
LSSerializer
将数据作为 XML 文件写出。 regex 替换仅删除 XML header 并规范化空格。
我想做什么? - 我正在尝试将下面 xml 中的 InputData 文档提取为 XML(而不是元素的 textContent ).
<?xml version="1.0" encoding="UTF-8"?>
<Test>
<Identifier>1</Identifier>
<Mode>SYNCHRONOUS</Mode>
<Callback>null</Callback>
<InputData>
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
</InputData>
</Test>
当我执行 node.item(i).textContent() 时,我希望输出为:
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
问题代码是什么? -
private void doProcessing(Document xmldoc) {
Element rootEliment = xmldoc.getDocumentElement();
// System.out.println("NodeName : "+rootEliment.getNodeName());
NodeList children = rootEliment.getChildNodes();
NamedNodeMap nnl = rootEliment.getAttributes();
Node inputdata = nnl.getNamedItem("InputData");
// inputdata.getOwnerDocument().g
// System.out.println("inputDataValuefirst: "+inputdata.getTextContent());
// NodeList testList = xmldoc.getElementsByTagName("InputData");
for (int i = 0; i < children.getLength(); i++) {
// Element el = (Element)children.item(i);
//System.out.println("NodeName: " + children.item(i).getNodeName()
// + " TextValue: " + children.item(i).getTextContent());
if (children.item(i).getNodeName() == "InputData") {
NodeList childs = children.item(i).getChildNodes();
for (int j = 0; j < childs.getLength(); j++) {
System.out.println("NodeVal;ue: "
+ childs.item(j).getNodeName() + " Text: "
+ childs.item(j).getTextContent());
}
}
}
}
给我: 节点值;ue:iid 文本:pp1
我也尝试过其他各种组合。它们都给出了子节点的 textContent 而不是节点本身。我怎样才能做到这一点?
使用 LSSerializer
.
<iid>
节点序列化为字符串
try {
NodeList childNodes = xmldoc.getDocumentElement().getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
Node node = childNodes.item(i);
if ("InputData".equals(node.getNodeName())) {
Node iid = node.getFirstChild();
while (!"iid".equals(iid.getNodeName())) {
iid = iid.getNextSibling();
}
String iidTree = ((DOMImplementationLS) xmldoc
.getImplementation()).createLSSerializer()
.writeToString(iid);
System.out.println(iidTree.replaceFirst("<.*?>\n", "")
.replaceAll("[ ]", ""));
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
输出:
<iid>
<test3>p</test3>
<test4>p1</test4>
</iid>
LSSerializer
将数据作为 XML 文件写出。 regex 替换仅删除 XML header 并规范化空格。