【问题标题】:Getting specific Substring from a large string从大字符串中获取特定的子字符串
【发布时间】:2011-10-06 16:18:51
【问题描述】:
<emp>
<name>Jhon</name>
<sal>2000</sal>
</emp>

我将把这个 xml 作为字符串。我需要从字符串生成一个 xml 文件,我需要用名称 tag.eg:Jhon.xml 命名生成的 xml 文件。请提供一些指针来做同样的事情java 不使用解析器。

【问题讨论】:

标签: java xml regex substring


【解决方案1】:

使用字符串子字符串或正则表达式正在解析文件。我假设您的意思是您不想解析每个细节。

如果您知道每个元素都在一行上,您可以使用以下方法。

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)) {

    }
}

【讨论】:

    【解决方案2】:

    虽然在使用正则表达式而不是 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 解析无关紧要),也会容易出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2012-12-28
    • 2013-11-20
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多