在元素类型或属性名称中找到无效的第二个“:”

时间:2013-12-04 07:42:19

标签: jaxb

class foo
{
  public static List parse(String input_xml)
        {
        try {
              // JAXB context created.
              JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
                ByteArrayInputStream input = new ByteArrayInputStream(input_xml.getBytes());
                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

              // Error comes while unmarshalling the input
                Root root = (Root) jaxbUnmarshaller.unmarshal(input);
                HashMap<String,String> map1 = new HashMap<String,String>();

              //... Code to retrieve values from "root" and put it in list
                  }
              }

    public static void main(String[] args) 
    {
        String input= "<?xml version=\"1.0\"?>"
            +"<root>"
            +"<attribs R:SSB:12 = \"ABC\"/>" +
            "</root>";

        List list = parse(input);
    }
 }
  1. “attribs”可以包含多个“属性 - 值”对,因此我需要使用Jaxb“UNMARSHAL”。
  2. 我尝试使用QName,但它的抛出错误。
  3. 问题:在解析时,我收到此错误:“在元素类型或属性名称中找到了无效的第二个':'。” ....但我找不到任何帮助......在我的情况下,属性名称和值是动态的。

    感谢您的帮助!!! * /

2 个答案:

答案 0 :(得分:0)

问题是您尝试使用无效的XML提供JAXB:

<attribs R:SSB:12 = "ABC">

冒号符号在XML中具有特殊含义:它在该命名空间下分隔namespace和属性(或标记)名称。这就是属性(或标签)只能包含一个冒号的原因。

如果您的属性名称来自其他地方,则必须转义冒号以使其成为有效的XML属性。尝试使用短划线符号(-)替换冒号,例如:

<attribs R-SSB-12="ABC">

答案 1 :(得分:0)

额外:导致问题,因为默认情况下JAXB期望:后面的部分是名称空间前缀。您可以通过强制JAXB使用不支持名称空间的解析器来解决此问题。

这可以通过SAX解析器轻松完成,并利用JAXB的UnmarshallerHandler作为ContentHandler

完整示例