android– 简单XML–2个元素,同名不同的命名空间

android– 简单XML–2个元素,同名不同的命名空间,第1张

概述我需要将XML字符串解析为对象.我会使用SimpleXML,但是我收到一个错误,在’url’私有java.lang.Stringcom.example.rogedormans.xmlreader.XML.Alert.Channel.url字段上复制了名称’link’的注释.具有相同问题的示例XML:<rss........><channel><title>TheTitle<

我需要将XML字符串解析为对象.我会使用SimpleXML,但是我收到一个错误,在’url’私有java.lang.String com.example.rogedormans.xmlreader.XML.Alert.Channel.url字段上复制了名称’link’的注释.

具有相同问题的示例XML:

<RSS........>     <channel>         <Title>The Title</Title>         <link>http://www.someurl.com</link>         <description>Some description</description>         <atom:link href="http://dunno.com/RSS.xml" rel="self" type="application/RSS+xml"/>        ....        ....    </channel> </RSS>

我Google了很多,发现This,this和this stackoverflow文章,但没有一个对我有用…我也读了Simple XML documentation,但我不能让它工作.

如何将两个“链接”项目都放入我的对象中? (我认为这是命名空间的东西,但是什么?)

一个代码示例会很好!!!

解决方法:

您可以通过为Channel类实现Converter来解决此问题.

这是给你的一个例子.它缺少任何类型的错误检查等,并且仅使用单个Atom简化为Channel类.但是你会看到它是如何工作的.

带转换器的类通道

@Root()@Convert(Channel.ChannelConverter.class) // Specify the Converterpublic class Channel{    @Element    private String Title;    @Element    private String link;    @Element    private String description;    @namespace(reference = "http://www.w3.org/2005/Atom", prefix = "atom")    @Element()    private Atomlink atomlink;    // Ctor's / getter / setter ...    static class ChannelConverter implements Converter<Channel>    {        @OverrIDe        public Channel read(inputNode node) throws Exception        {            Channel channel = new Channel();            inputNode child;            // Iterate over all childs an get their values            while( ( child = node.getNext() ) != null )            {                switch(child.getname())                {                    case "Title":                        channel.setTitle(child.getValue());                        break;                    case "description":                        channel.setDescription(child.getValue());                        break;                    case "link":                        /*                         * "link" can be either a <link>...</link> or                         * a <atom:link>...</atom:link>                         */                        if( child.getPrefix().equals("atom") == true )                        {                            Atomlink atom = new Atomlink();                            atom.sethref(child.getAttribute("href").getValue());                            atom.setRel(child.getAttribute("rel").getValue());                            atom.setType(child.getAttribute("type").getValue());                            channel.setAtomlink(atom);                        }                        else                        {                            channel.setlink(child.getValue());                        }                        break;                    default:                        throw new RuntimeException("UnkNown Element found: " + child);                }            }            return channel;        }        @OverrIDe        public voID write(OutputNode node, Channel value) throws Exception        {            /*             * Todo: Implement if necessary             */            throw new UnsupportedOperationException("Not supported yet.");        }    }    @Root    public static class Atomlink    {        @Attribute        private String href;        @Attribute        private String rel;        @Attribute        private String type;        // Ctor's / getter / setter ...    }}

所有内部类也可以作为通常的类实现.如果(去)序列化的事情很复杂,你也可以在转换器中使用串行器.

用法

最后一个演示:

final String xml = "     <channel>\n"        + "         <Title>The Title</Title>\n"        + "         <link>http://www.someurl.com</link>\n"        + "         <description>Some description</description>\n"        + "         <atom:link href=\"http://dunno.com/RSS.xml\" rel=\"self\" type=\"application/RSS+xml\" xmlns:atom=\"http://www.w3.org/2005/Atom\" />\n"        + "        ....\n"        + "        ....\n"        + "    </channel>\n";Serializer ser = new Persister(new AnnotationStrategy());//                             ^----- important! -----^Channel c = ser.read(Channel.class, xml);System.out.println(c);

请注意,转换器需要一个策略(有关详细信息,请参阅上面的链接);我使用了AnnotationStrategy,因为你可以简单地使用@Convert().必须在XML中的某个位置定义xmlns,否则您将捕获异常;我将它放入< atom:link ... />这里.

产量

Channel{Title=The Title, link=http://www.someurl.com, description=Some description, atomlink=Atomlink{href=http://dunno.com/RSS.xml, rel=self, type=application/RSS+xml}}
总结

以上是内存溢出为你收集整理的android – 简单XML – 2个元素,同名不同的命名空间全部内容,希望文章能够帮你解决android – 简单XML – 2个元素,同名不同的命名空间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1118264.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存