从一个大字符串中获取特定的子串

4
<emp>
<name>Jhon</name>
<sal>2000</sal>
</emp>

我将得到这个xml字符串。我需要从该字符串生成一个xml文件,并且我需要使用名称标签来命名生成的xml文件,例如:Jhon.xml。请为我提供一些在Java中执行此操作的指针,而不使用解析器。


2
https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Rekin
但是,在另一方面:https://dev59.com/2W855IYBdhLWcg3woV7M#4231482 - Rekin
请勿使用正则表达式解析XML。XML是一种结构化数据格式,需要使用专门的XML解析器来正确地解析它。Java中有许多可用的XML解析器,包括DOM和SAX解析器。使用这些解析器可以轻松地从XML文档中提取所需的数据,并且比使用正则表达式更加可靠和高效。 - fyr
2个回答

2
使用字符串子串或正则表达式来解析文件。我猜你的意思是你不想要解析每一个细节。
如果你知道每个元素都在自己的一行上,你可以使用以下方法。
BufferedReader br = 
String line;
while((line = br.readLine()) != null) {
    String[] parts = line.split("[<>]");
    String tag = parts[1];
    String value = parts[2];
    if ("name".equals(tag)) {

    } else if ("ruleId".equals(tag)) {

    } else if ("ruleVersion".equals(tag)) {

    }
}

0

尽管在使用正则表达式处理XML时需要谨慎,但以下代码可以一行搞定:

String filename = input.replaceAll("(?s).*<name>(.*)</name>.*<ruleId>(.*)</ruleId>.*<ruleVersion>(.*)</ruleVersion>.*", "$1_$2_$3.xml");

(?s)很重要 - 它打开了“点匹配换行符”开关,因此您的输入可以包含多行(即嵌入式换行符),但被视为单行。

这是一个您可以运行的测试:

public static void main(String[] args) throws Exception
{
    String input = "<name>remove use case</name>\n    <ruleId>2161</ruleId>\n    <ruleVersion>0.0.1</ruleVersion>\n    <ruleStatus>New</ruleStatus>\n    <nuggetId>489505737</nuggetId>\n    <icVersionId>50449</icVersionId>\n    <rlVersion>1.0</rlVersion>\n    <modelVersion>1.0</modelVersion>\n    <attributes>\n        <attribute>\n            <attributeName/>\n            <value/>\n        </attribute>\n    </attributes>\n    <notes></notes>";
    String filename = input.replaceAll("(?s).*<name>(.*)</name>.*<ruleId>(.*)</ruleId>.*<ruleVersion>(.*)</ruleVersion>.*", "$1_$2_$3.xml");
    System.out.println(filename);
}

输出:

remove use case_2161_0.0.1.xml

虽然我会采用类似的方法,但我不会把所有内容都放在一个正则表达式中。当然,这样做会更短,但如果某个文件中的标签顺序不同(对于通用的 XML 解析来说并不重要),那么它也容易出错。 - Mario

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接