我不想在XML中解析一些标签

时间:2010-08-22 18:02:30

标签: xml parsing dtd

目前,这将是我正在处理的示例XML:

<smsq>
  <sms>
  <id>96</id>
  <to>03333560511</to>
  <msg>  danial says: hahaha <space> nothing.
  </msg>
  </sms>
</smsq>

现在请注意,标签可以包含其他标签(不应该解析),我必须为此做一个dtd。 dtd是这样的:

<!DOCTYPE smsq [
  <!ELEMENT sms (mID,to,msg,type)>
  <!ELEMENT mID (#PCDATA)>
  <!ELEMENT to (#PCDATA)>
  <!ELEMENT msg (CDATA)>
]>

但问题是XML解析器仍然在标记中,并且表示标记应该用标记关闭。我只是想从XML中获取数据,我不想进一步解析msg。

请帮我解决问题,并告诉我是否可以使用DTD。

谢谢!

5 个答案:

答案 0 :(得分:4)

你不能制作一个DTD,让错误的XML神奇地没有错误。 XML格式不正确,因此它永远不会有效,因为良好的形式是有效性的先决条件(有效性在AFAICT中甚至不重要)。它类似于英语句子中的单词如何成为英语单词之前的英语单词。

<space>未关闭。它应该在</space>内有一个<msg>,用<space/>替换,或者如果说你不想让它被pare,你就意味着你想要实际的文本{{1}在那里,你应该这样编码(即"<space>")。

答案 1 :(得分:3)

DTD无法帮助您解决此问题。 DTD绝不是必需的(尽管它非常方便)。

您在上面发布的文档不是有效的XML文档。期。就是这样,没有合理的XML解析器会为你解析它而不会引发错误。

您可以做的是将<符号替换为&lt; XML实体。

答案 2 :(得分:1)

首先,样本xml不是真正的xml,因为“space”标记未关闭。

其次,看起来不想解析“space”标签的原因是因为它不是真正的xml - 只是看起来像xml的文本。文本应该被转义/编码或包含在CDATA标签中。

最后 - 如果你要解析的是xml,你只想解析第一级标签。我不打算使用真正的XML解析器 - 我会创建自己的超简单解析器 - 所有它必须做的就是解析第一级节点 - 这不应该太难。

祝你好运!

答案 3 :(得分:1)

必须关闭所有XML标记,例如<tag></tag><tag />

如果您希望将<space>标记解析为标记的文本值而不是子标记,请使用&lt;&gt;代替<>

&lt;space&gt;

答案 4 :(得分:0)

我会将您的问题的解决方案隔离到一个方法中并暂时处理它。毕竟,您可能无法控制邮件内容的正确性。

private static String getMessage(String msg){
    return msg.substring(msg.indexOf("<msg>")+5, msg.lastIndexOf("</msg>"));
}//method

随着更多用例的推出,您可以稍后进行增强。

编辑:如果有人在内容中添加了“msg”元素,那么它仍然有效