如何解析在元素属性值中包含特殊字符的xml。如何用空格替换该特殊字符并在java中解析它

时间:2012-09-22 08:12:21

标签: json xmlhttprequest xml-serialization

我正在尝试使用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元素检查具有属性值,并且它包含&lt;或者“。解析器将其视为无效并抛出解析器异常。

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

例如:如果xml包含&lt;

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

替换为空格

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

。请给我一些建议。它可以用什么方法完成......我们可以用XSD做吗...

提前感谢。

3 个答案:

答案 0 :(得分: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: >

答案 1 :(得分:0)

有人可能会说它是不是真的是xml。一条规则是xml必须格式正确。这意味着标签必须具有打开和关闭,在所有地方都不允许某些字符(特别是属性中的&lt;&gt;)。

如果你无法从源头纠正这个问题,也就是说,生成格式良好的xml,那么我猜你需要首先进行简单搜索并替换为@Visher建议,然后将其视为xml或者提出你的想法自己的解析器

答案 2 :(得分:0)

此代码运行良好(用引号替换'&lt;'和'&gt;'):

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());
}

如果您在引号内添加其他引号,则会出现问题。