0

我正在尝试使用 DOM 或 SAX 解析 java 中的 xml 文件。问题是在解析时,如果我的 xml 包含属性值作为特殊字符,例如 < >",那么解析器会抛出 ParserException。

例如 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<abc>
<check name="bike" value="apache <nice model"/> 
<check name="car" value="tata sumo "style" />
</abc>

在此示例中,xml 元素检查具有属性值,并且包含 < 或 " 。解析器将其视为无效并引发解析器异常。

现在我的问题是,在将 xml 文件解析为解析器之前,检测 xml 文件属性值中的特殊字符(< 或 > 或 "),并且必须用空格替换该符号(< > ")。

例如:如果 xml 包含 <

<check name="bike" value="apache <nice model"/> 

替换为空格

<check name="bike" value="apache  nice model"/> 

.请给我建议。用什么方法可以完成...我们可以使用 XSD 来完成...

提前致谢。

4

3 回答 3

0

用实体替换这些符号怎么样?

&apos; is an apostrophe: '
&amp; is an ampersand: &
&quot; is a quotation mark: "
&lt; is a less-than symbol: <
&gt; is a greater-than symbol: >
于 2012-09-22T08:35:25.380 回答
0

有人可能会争论它是否真的是 xml。一条规则是 xml 必须格式正确。这意味着标签必须有开始和结束,在所有地方都不允许使用某些字符(特别是属性中的 <>)。

如果您不能从源头纠正这个问题,即生成格式良好的 xml,那么我想您需要先按照@Visher 的建议进行简单的搜索和替换,然后将其视为 xml 或提出自己的解析器

于 2012-09-22T08:37:21.003 回答
0

此代码运行良好(替换引号中的 '<' 和 '>'):

public static void main(String[] args)
{
    char[] characters = new char[]{'<', '>'};
    String[] entities = new String[]{"&lt;", "&gt;"};

    String text = "<check name=\"bike\" value=\"apache <nice model\"/> ";
    StringBuilder sb = new StringBuilder();
    boolean insideQuotation = false;

    for (int i = 0; i < text.length(); i++)
    {
        char character = text.charAt(i);

        if (insideQuotation)
        {
            int index = -1;

            for (int x = 0; x < characters.length; x++)
            {
                if (characters[x] == character)
                {
                    index = x;
                    break;
                }
            }

            if (index != -1)
                sb.append(entities[index]);

            else
                sb.append(character);

            if (character == '"')
                insideQuotation = false; 
        }
        else
        {
            if (character == '"')
                insideQuotation = true;

            sb.append(character);
        }
    }

    System.out.println(sb.toString());
}

如果您在引号内添加另一个引号,则会出现问题。

于 2012-09-22T09:45:12.797 回答