我有一个大字符串,其中包含一些XML。此XML包含如下输入:
<xyz1>...</xyz1>
<hello>text between strings #1</hello>
<xyz2>...</xyz2>
<hello>text between strings #2</hello>
<xyz3>...</xyz3>
我希望得到所有这些<hello>text between strings</hello>
。
所以最后我想要一个包含所有<hello>...</hello>
我尝试使用Regex和Matcher,但问题是它不适用于大字符串....如果我尝试使用较小的字符串,它可以工作。我读了一篇关于这个的博客文章,这说明Java Regex因大字符串的交替而被破坏。
有没有简单易行的方法呢?
修改
尝试是......
String pattern1 = "<hello>";
String pattern2 = "</hello>";
List<String> helloList = new ArrayList<String>();
String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);
Pattern pattern = Pattern.compile(regexString);
Matcher matcher = pattern.matcher(scannerString);
while (matcher.find()) {
String textInBetween = matcher.group(1); // Since (.*?) is capturing group 1
// You can insert match into a List/Collection here
helloList.add(textInBetween);
logger.info("-------------->>>> " + textInBetween);
}
答案 0 :(得分:1)
您必须使用xml解析器解析xml。它比使用正则表达式更容易。
DOM解析器是最简单的使用,但如果您的xml非常大,请使用SAX解析器
答案 1 :(得分:1)
我强烈建议使用多种可用的公共XML解析器之一:
实现您想要实现的目标会更容易(即使您希望将来详细说明您的要求)。如果您对速度和内存没有任何问题,请继续使用 dom4j 。如果您希望我在这个答案中发布好的示例,那么在线有大量的资源,因为我现在的答案只是重定向您的替代选项,但我不确定您的限制是什么。
关于解析XML时的REGEX,Dour High Arch给出了很好的回复:
XML不是常规语言。您无法使用正则表达式解析它。当你获得嵌套标签时,你认为可以使用的表达式会破坏,然后当你修复它时会破坏XML注释,然后是CDATA部分,然后是处理器指令,然后命名空间,......它无法工作,使用XML解析器。 / p>
答案 2 :(得分:1)
如果您必须解析XML文件,我建议您使用XPath语言。所以你必须基本上做这些行动:
String
尝试查看this link。
您必须做的一个例子是:
String xml = ...;
try {
// Build structures to parse the String
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// Parse the XML string into a DOM object
Document document= builder.parse(new ByteArrayInputStream(xml.getBytes()));
// Create an XPath query
XPath xPath = XPathFactory.newInstance().newXPath();
// Query the DOM object with the query '//hello'
NodeList nodeList = (NodeList) xPath.compile("//hello").evaluate(document, XPathConstants.NODESET);
} catch (Exception e) {
e.printStackTrace();
}
答案 3 :(得分:0)
使用Java 8,您可以使用Dynamics库以直接的方式执行此操作
XmlDynamic xml = new XmlDynamic(
"<bunch_of_data>" +
"<xyz1>...</xyz1>" +
"<hello>text between strings #1</hello>" +
"<xyz2>...</xyz2>" +
"<hello>text between strings #2</hello>" +
"<xyz3>...</xyz3>" +
"</bunch_of_data>");
List<String> hellos = xml.get("bunch_of_data").children()
.filter(XmlDynamic.hasElementName("hello"))
.map(hello -> hello.asString())
.collect(Collectors.toList()); // ["text between strings #1", "text between strings #2"]