gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:55 28 4
gpt4 key购买 nike

我需要将 XML 字符串解析为对象。我会为此使用 SimpleXML,但出现错误,Duplicate annotation of name 'link' on field 'url' private java.lang.String com.example.rogedormans.xmlreader.XML.Alert.Channel.url

具有相同问题的示例 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>

我用谷歌搜索了很多,找到了This , thisthis stackoverflow 文章,但没有对我有用...我还阅读了 Simple XML documentation但我无法让它工作。

我怎样才能将两个“链接”项都放入我的对象中? (我认为它与 namespace 有关,但是什么?)

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

最佳答案

您可以通过实现 Converter 来解决此问题对于 Channel 类。


这是一个例子。它缺少任何类型的错误检查等,并减少到 Channel类与单个 Atom只要。但您会看到它是如何工作的。

ChannelConverter

@Root()
@Convert(Channel.ChannelConverter.class) // Specify the Converter
public 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 ...
}
}

所有内部类也可以像普通类一样实现。如果事情复杂到(反)序列化,你可以使用 SerializerConverter 内也是。

用法

最后是一个演示:

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);

请注意 Converter需要 Strategy (有关更多详细信息,请参见上面的链接);我用过AnnotationStrategy因为你可以简单地使用 @Convert()然后。 xmlns必须在您的 XML 中的某处定义,否则您将捕获异常;我把它放到了<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 个元素,同名不同命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35129210/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com