gpt4 book ai didi

java - 用 Java 解析 XML

转载 作者:行者123 更新时间:2023-12-01 18:37:57 26 4
gpt4 key购买 nike

我得到了这个格式不正确的 XML 文件,但无论如何我都需要解析它。我已经尝试了所有解析选项,比如 DOM/SAX 解析,但仍然无法实现它,尝试过 this

谁能指导我如何解析这种格式不正确的 xml 数据。

这是 XML 文件

<?xml version="1.0" ?>
<Employee>
<Name> Jack
<EMPID> EMP001 <Address> 12 CA, USA</Address>
</EMPID>
</Name>
</Employee>

解析代码

DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(
"new.xml"));

// normalize text representation
doc.getDocumentElement().normalize();
System.out.println("Root element of the doc is "
+ doc.getDocumentElement().getNodeName());

NodeList listOfPersons = doc.getElementsByTagName("NAME");
int totalPersons = listOfPersons.getLength();


for (int s = 0; s < listOfPersons.getLength(); s++) {

Node firstPersonNode = listOfPersons.item(s);
if (firstPersonNode.getNodeType() == Node.ELEMENT_NODE) {

Element firstPersonElement = (Element) firstPersonNode;

// -------
NodeList firstNameList = firstPersonElement
.getElementsByTagName("Name");
Element firstNameElement = (Element) firstNameList.item(0);

NodeList textFNList = firstNameElement.getChildNodes();
System.out
.println("Name : "
+ ((Node) textFNList.item(0))
.getNodeValue().trim());

// -------
NodeList lastNameList = firstPersonElement
.getElementsByTagName("EMPID");
Element lastNameElement = (Element) lastNameList.item(0);

NodeList textLNList = lastNameElement.getChildNodes();
System.out
.println("ID : "
+ ((Node) textLNList.item(0))
.getNodeValue().trim());

// ----
NodeList ageList = firstPersonElement
.getElementsByTagName("Address");
Element ageElement = (Element) ageList.item(0);

NodeList textAgeList = ageElement.getChildNodes();
System.out.println("Address : "
+ ((Node) textAgeList.item(0)).getNodeValue()
.trim());



}

}

} catch (SAXParseException err) {
System.out.println("** Parsing error" + ", line "
+ err.getLineNumber() + ", uri " + err.getSystemId());
System.out.println(" " + err.getMessage());

} catch (SAXException e) {
Exception x = e.getException();
((x == null) ? e : x).printStackTrace();

} catch (Throwable t) {
t.printStackTrace();
}

最佳答案

既然 XML 本身就是损坏的 XML 解析就会失败。

假设尽管损坏,XML 文件将始终具有该布局,您可以使用正则表达式来提取数据。

String str = "<?xml version=\"1.0\" ?>\n" +
"<Employee>\n" +
"<Name> Jack\n" +
"<EMPID> EMP001 <Address> 12 CA, USA</Address> \n" +
"</EMPID>\n" +
"</Name>\n" +
"</Employee>";
str = str.replaceAll("\\n", "");
Pattern p = Pattern.compile("<Name>(.+?)<EMPID>(.+?)<Address>(.+?)</Address>");
Matcher m = p.matcher(str);
while(m.find())
{
System.out.println("Name: " + m.group(1) + " EMPID: " + m.group(2) + " Address: " + m.group(3));
}

产量:

Name: Jack EMPID: EMP001 Address: 12 CA, USA

这个模式有什么作用:

  • <Name>将匹配 Name标签。
  • (.+?)将匹配 <Name> 后面的文本标签,但一旦找到 <EMPID> 就会停止匹配,因为它不是贪婪模式,因为 ?添加在贪婪运算符 + 之后(这将与模式的下一部分相匹配。同样在本部分中,任何匹配的内容都将被放置在一个组中,以便稍后访问。
  • 提取名称后,引擎将尝试匹配 <EMPID>标签。
  • 之后 <EMPID>标签已匹配,将发生类似于步骤2的过程,并将匹配的内容放入另一组中。
  • 下一步,代码将查找 <Address>
  • 最后,正则表达式将尝试提取 <Address> 之间的任何字符。和</Address>标签,并且再次,任何匹配的内容都将被放置在一个组中。

一旦正则表达式解析字符串,我就可以访问组并打印它们的值。作为额外的一步,我将删除所有换行符以将字符串作为一个行进行处理。

正则表达式的入门教程可以在 here 找到。 .

关于java - 用 Java 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com