【问题标题】:Jsoup : SelectorParseException when colon in xml tagJsoup:xml标签中冒号时出现SelectorParseException
【发布时间】:2012-11-13 14:52:48
【问题描述】:

xml标签有冒号时抛出异常,

例外:

org.jsoup.select.Selector$SelectorParseException: 无法解析查询 'w:r': ':r' 处出现意外标记

XML:

<w:r>
 <w:rPr>
   <w:rStyle w:val="jid"/>
 </w:rPr>
 <w:t>AN</w:t>
</w:r>

Java 代码:

    org.jsoup.nodes.Document doc = Jsoup.parse(documentXmlString);

这里documentXmlString有上面指定的xml

【问题讨论】:

    标签: java xml-parsing jsoup


    【解决方案1】:

    只需将“:”替换为“|”

    doc.select("w|r");
    

    我正在使用 Jsoup 1.5.2。

    【讨论】:

    • 如果内容有“:”,那么这个就不行了。例如:google.com。如果你替换它,它就会变成 http|//www.google.com
    【解决方案2】:

    虽然你的拼凑对你有用..我想提供有关命名空间的知识!

    XML 中的w: 实际上称为命名空间前缀。并且要使用 neamespace 前缀,它必须在根节点中声明! 1+ 由于源 XML 中缺少声明部分!解析器抛出错误! 下面是在 XML 中定义命名空间的方法!我已经更正了你自己的 XML,我敢打赌它现在不会出错了!

    <w:r xmlns:w="http://www.w3.org/SomeNamespace">
      <w:rPr>
        <w:rStyle w:val="jid"/>
      </w:rPr>
      <w:t>AN</w:t>
    </w:r>
    

    其他信息:

    命名空间有自己的范围!在下面的例子中:

    <root>
        <w:r xmlns:w="http://www.w3.org/SomeNamespace">
          <w:rPr>
            <w:rStyle w:val="jid"/>
          </w:rPr>
          <w:t>AN</w:t>
        </w:r>
        <someotherElement>
          <dummychild/>
        </someotherElement>
    

    在上面的例子中,你不能在&lt;someotherElement&gt;&lt;dummychild/&gt; 上使用命名空间前缀!!因为命名空间前缀 w 的范围仅限于元素 &lt;r&gt; 及其子(孙)!


    1+:在其下声明命名空间的元素..命名空间将对其自身及其子节点有效..在根下声明命名空间使命名空间对 XML 文档中的所有元素都有效/可用.

    【讨论】:

    • 非常感谢 aravind。但我无法使用命名空间更改我的输入 xml 文件。不过这些信息很有用。
    • @Kate,我猜到了!好吧。很高兴你发现它有用:)
    【解决方案3】:

    我用过,

     documentXmlString = documentXmlString.replaceAll("w:","w");
    

    【讨论】:

    • 干得好!点赞!!这确实是源 XML 的问题。请参考我的回答,如果您有任何问题或疑虑,请告诉我..
    【解决方案4】:

    JSoup 是一个 html 而不是 XML 解析器。对于 XML,您可以使用 JAXB、SAXON 或 Xstream。

    【讨论】:

    • 哦,谢谢 :) 我不知道,所以可能是其中的一个错误,或者简单的 xml 解析器太简单了 :)
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 2012-03-10
    相关资源
    最近更新 更多