gpt4 book ai didi

java - 寻找正则表达式模式来清理 XML 字符串的各个部分

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:31 25 4
gpt4 key购买 nike

我们收到一个 XML 字符串,在解码之前我们只需要清理一个属性值。问题是 xml 的类型非常松散,并且不能保证属性将按任何特定顺序甚至存在。

<message>
<set name=".." value="garbled string" type="name" />
<set age=".." value="32" />
<set something=".." value="value=\"\"\"\"" />
..
</message>

在此字符串中,我需要调用一个模式,以便仅将字符串作为 XML 的 value 属性,对任何特殊字符 (StringEscapeUtils.escapeXml()) 进行编码并替换其值。即使该值内部包含字符串“value”,也不应导致任何正则表达式模式不匹配。

请帮忙。

最佳答案

我最近不得不做类似的事情(即编码特殊字符以便让解码器/解析器完成其工作)。我想出的解决方案如下:

  • 使用流解析器(我使用 woodstox )
  • 给流解析器一个自定义的java.io.FilterReader
  • 实现 FilterReader 的 read 方法,以便在读取特殊字符时对其进行编码,即如下所示:

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {

    int charsWithoutEntity = len / 4;
    int read = super.read(myBuffer, off, charsWithoutEntity <= myBuffer.length ? charsWithoutEntity : myBuffer.length);
    int j = 0;

    for (int i = 0; i < read; i++, j++) {

    cbuf[j] = myBuffer[i];
    if (myBuffer[i] == '&') {
    cbuf[++j] = 'a';
    cbuf[++j] = 'm';
    cbuf[++j] = 'p';
    cbuf[++j] = ';';
    }
    }

    return read > 0 ? j : read;
    }

我选择流式解析器的原因与此问题无关,并且我非常确定您可以将 FilterReader 提供给 JAXB 的 Unmarshaller,因此在您不想/不需要使用解析器的情况下也可以应用相同的解决方案。

关于java - 寻找正则表达式模式来清理 XML 字符串的各个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822685/

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