因此,我有以下XML文件
样品:
<Entry>
<ns0:entity-Person>
<ns0:Cell>333-333-3333</ns0:CellPhone>
<ns0:DOB>1970-01-01T01:00:00-05:00</ns0:DateOfBirth>
<ns0:FN>Raymond</ns0:FirstName>
<ns0:Gender>M</ns0:Gender>
</ns0:entity-Person>
<ns0:EmailAddress1>[email protected]</ns0:EmailAddress1>
<ns0:EmailAddress2>[email protected]</ns0:EmailAddress2>
<ns0:Entry>
<ns1:OfficialIDType>SSN</ns1:OfficialIDType>
<ns1:OfficialIDValue>342-56-8729</ns1:OfficialIDValue>
</ns0:Entry>
..
..
我想要以下输出:
Entry
ns0:entity-Person
ns0:CellPhone
ns0:DateOfBirth
ns0:FN
ns0:Gender
ns0:EmailAddress1
ns0:EmailAddress2
ns0:Entry
ns1:OfficialIDType
ns1:OfficialIDValue
因此,基本上,我希望每个父节点的子节点都有一个缩进(在Java中为“ \ t”)。
就目前而言,我有以下代码(递归):
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("C:\\sub.xml"));
parseTheTags(document.getDocumentElement());
}
public static void parseTheTags(Node node) {
System.out.println(node.getNodeName());
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
parseTheTags(currentNode);
}
}
}
我也知道如何不递归地执行此操作,但这是我无法执行的缩进。
我知道这将对某处代码进行一些小的更改,但是我已经花了很多时间在此上,但无济于事。
那时候我以为stackoverflow可以帮助我!
编辑代码:现在,为每个子节点附加一个选项卡:尽管输出有问题
public class NewParseXMLTags {
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("C:\\Users\\parasv1\\Desktop\\Self\\sub.xml"));
StringBuilder tmp = new StringBuilder();
tmp.append("");
parseTheTags(tmp, document.getDocumentElement());
}
public static void parseTheTags(StringBuilder indentLevel, Node node) {
StringBuilder indent = new StringBuilder();
System.out.println(indentLevel+node.getNodeName());
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node currentNode = nodeList.item(i);
if (currentNode.getNodeType() == Node.ELEMENT_NODE) {
if (currentNode.hasChildNodes())
{
indent.append("\t");
parseTheTags(indent, currentNode);
}
}
}
}
}
答案:
因此,经过Sbodd的认真思考和帮助,我找到了解决方法:这很简单!
public class ParseXML {
public static void main(String[] args) throws SAXException, IOException,
ParserConfigurationException, TransformerException {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new File("C:\\Users\\parasv1\\Desktop\\Self\\sub.xml"));
String tmp = new String();
tmp = "";
parseTags(tmp, document.getDocumentElement());
}
public static void parseTags (String indentLevel, Node node) {
//print out node-specific items at indentLevel
System.out.println(indentLevel+node.getNodeName());
String childIndent = indentLevel + "\t";
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node n = nodeList.item(i);
if (n.getNodeType() == Node.ELEMENT_NODE) {
parseTags(childIndent, n);
}
}
}
他的任何帮助将不胜感激!
最佳答案
简短形式是:在parseTheTags中添加一个indentLevel
参数。在每个递归调用上,递增indentLevel,然后使用它来格式化输出。
编辑更新的代码:
您实际上并不是递归使用indentLevel
;您传递给子调用的值indent
根本与indentLevel
变量无关。另外,您可能不希望对递归深度变量使用StringBuilder-对它的更改将在递归调用层次结构中上下传播。
您的基本通话结构应大致类似于
public void parseTags (String indentLevel, Node node) {
//print out node-specific items at indentLevel
String childIndent = indentLevel + "\t";
for (Node n : /*whatever nodes you're recursing to*/) {
parseTags(childIndent, n);
}
}
这是一个相当标准的递归构造。在当前节点上执行一个操作,增加递归深度计数器的值,并进行适当的递归调用。