目前,这将是我正在处理的示例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。
谢谢!
答案 0 :(得分:4)
你不能制作一个DTD,让错误的XML神奇地没有错误。 XML格式不正确,因此它永远不会有效,因为良好的形式是有效性的先决条件(有效性在AFAICT中甚至不重要)。它类似于英语句子中的单词如何成为英语单词之前的英语单词。
<space>
未关闭。它应该在</space>
内有一个<msg>
,用<space/>
替换,或者如果说你不想让它被pare,你就意味着你想要实际的文本{{1}在那里,你应该这样编码(即"<space>"
)。
答案 1 :(得分:3)
DTD无法帮助您解决此问题。 DTD绝不是必需的(尽管它非常方便)。
您在上面发布的文档不是有效的XML文档。期。就是这样,没有合理的XML解析器会为你解析它而不会引发错误。
您可以做的是将<
符号替换为<
XML实体。
答案 2 :(得分:1)
首先,样本xml不是真正的xml,因为“space”标记未关闭。
其次,看起来不想解析“space”标签的原因是因为它不是真正的xml - 只是看起来像xml的文本。文本应该被转义/编码或包含在CDATA标签中。
最后 - 如果你要解析的是xml,你只想解析第一级标签。我不打算使用真正的XML解析器 - 我会创建自己的超简单解析器 - 所有它必须做的就是解析第一级节点 - 这不应该太难。
祝你好运!答案 3 :(得分:1)
必须关闭所有XML标记,例如<tag></tag>
或<tag />
。
如果您希望将<space>
标记解析为标记的文本值而不是子标记,请使用<
和>
代替<
和>
:
<space>
答案 4 :(得分:0)
我会将您的问题的解决方案隔离到一个方法中并暂时处理它。毕竟,您可能无法控制邮件内容的正确性。
private static String getMessage(String msg){
return msg.substring(msg.indexOf("<msg>")+5, msg.lastIndexOf("</msg>"));
}//method
随着更多用例的推出,您可以稍后进行增强。
编辑:如果有人在内容中添加了“msg”元素,那么它仍然有效