问题描述
|
我正在尝试解析XML以吐出文件中包含的所有超链接。是否有捷径可寻?它可以像仅输出带有链接的文件一样简单。例如:
<POEM>
<AUTHOR>Ogden Nash</AUTHOR>
<TITLE>Fleas</TITLE>
<LINE>Adam</LINE>
<LINE>Had \'em.</LINE>
<URL>
<w:rStyle w:val=\"HyperLink\"/>
<w:t>https://www.ogdennash.com/</w:t>
</w:r>
</POEM>
将是XML。我只需要吐出一个文本文件即可:
https://www.ogdennash.com
任何帮助,将不胜感激。
解决方法
抱歉,如果您已经知道其中的一些内容,但是您说您不熟悉XML。
您将需要先清理标记,因为标记不是严格的XML。
例如标签
<w:rStyle w:val=\"HyperLink\"/>
没有定义的名称空间(w)
也
....
<URL>
<w:rStyle w:val=\"HyperLink\"/>
<w:t>https://www.ogdennash.com/</w:t>
</w:r>
....
不欢迎welformed xml
它应该是
....
<URL>
<w:r>
<w:rStyle w:val=\"HyperLink\"/>
<w:t>https://www.ogdennash.com/</w:t>
</w:r>
</URL>
....
如果您将文档格式化并添加一个名称空间,(我将w绑定到http://foo.bar),那么您的xml如下所示
<POEM xmlns:w=\"http://foo.bar\">
<AUTHOR>Ogden Nash</AUTHOR>
<TITLE>Fleas</TITLE>
<LINE>Adam</LINE>
<LINE>Had \'em.</LINE>
<URL>
<w:r>
<w:rStyle w:val=\"HyperLink\"/>
<w:t>https://www.ogdennash.com/</w:t>
</w:r>
</URL>
</POEM>
然后,您可以使用以下XPath表达式
// w:t / text()
选择标签内的所有超链接。但是,如果要获取URL标记内的所有链接,则需要从URL-> w:r-> w:t中获取文本-为此的XPath是这样的
// URL / w:r / w:t / text()
如果我要用Java编写,我会使用
JTIDY首先修复您的标记
一旦修复,我将使用JDOM(XML解析器)和Jaxen(XPath库)创建文本文件。
我可能会为您提供一个执行此操作的示例类。
这确实不是一个简单的方法,但是它可以工作。我希望它能给您一些指示。