如何将具有不同名称空间的相同XML元素反序列化为结构中的不同元素

丹麦文:

我正在使用以下类型的XML结构

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title>TITLE</title>
        <link>http://something.com</link>
        <description>description</description>
        <lastBuildDate>Mon, 19 Dec 2016 16:48:54 +0000</lastBuildDate>
        <language>en</language>
        <item>
            <title>Title</title>
            <description>description</description>
            <author>
                <name>Name</name>
                <uri></uri>
            </author>
            <pubDate>Mon, 19 Dec 2016 16:42:32 +0000</pubDate>
            <link>http://google.com</link>
            <image>...</image>
            <media:description><![CDATA[Natalie Massenet]]></media:description>
            <media:credit>David Fisher/REX/Shutterstock</media:credit>
            <category>Category1</category>
            <category>Category2</category>
            <guid isPermaLink="false">http://something.com/?p=10730393</guid>
            <media:group></media:group>
            <content:encoded>content</content:encoded>
        </item>
    </channel>
</rss>

我在弄清楚如何反序列化<description>以及将其<media:description>分解为结构中的两个不同元素时遇到了麻烦

我尝试了以下一种结构体来表示<item>,但是media:descriptionend 的值最终出现在该结构体中。

type Item struct {
    // ...other fields
    Description           string   `xml:"description"`
    MediaDescription      string   `xml:"media:description"`
    // ...other fields
}

最好的方法是什么?

丹麦文:

因此,Go当前无法支持此功能(@JimB指出),但是您仍然可以使用一些内置功能来提取正确的元素。首先定义一个新的结构XMLElement

type XMLElement struct {
    XMLName xml.Name
    Data    string `xml:",chardata"`
}

该结构可以捕获xml数据以及名称空间和元素名称。下一个映射xml:"description"到的数组XMLElement最终将捕获<*:description>列表中的所有元素。然后,您可以定义函数以提取正确的函数。

type Item struct {
    // ...other fields
    Descriptions           []XMLElement   `xml:"description"`
    // ...other fields
}

// GetDescription returns the description in the <description> tag
func (i *Item) GetDescription() string {
    for _, elem := range i.Descriptions {
        if elem.XMLName.Space == "" {
            return elem.Data
        }
    }
    return ""
}

// GetMediaDescription returns the description in the <media:description> tag
func (i *Item) GetMediaDescription() string {
    for _, elem := range i.Descriptions {
        if elem.XMLName.Space == "http://search.yahoo.com/mrss/" {
            return elem.Data
        }
    }
    return ""
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将具有相同名称的不同xml元素反序列化为不同的C#类

将具有不同元素的XML反序列化为单独的列表

如何将具有不同值的相同 JSON 对象反序列化为 Java 类

如何反序列化具有两个名称相同但元素具有不同数据类型的XML?

序列化和反序列化具有相同名称的Jackson XML元素

具有多个名称相同但内容不同的元素的 XML 反序列化

Newtonsoft json将复杂对象反序列化为具有不同名称的类

Java + Jackson + XML:将Java对象属性序列化为具有相同名称的XML元素

如何通过 Jackson 的元素属性将相同的 xml 元素反序列化为不同的类?(多态反序列化)

在C#中反序列化具有不同类型名称的XML元素

将XML反序列化为与XML元素名称不同的对象数组

在Jackson中反序列化具有相同名称但不同类型的属性?

将xml反序列化为具有不同层次结构的类?

如何将xml中的数组反序列化为没有类型属性的不同对象类型?

如何从具有相同名称的多个元素中获取单击元素,数组的不同索引索引

使用GSON将POJO序列化为具有不同名称的JSON?

在JSON.NET中反序列化具有不同名称的对象列表

将两个略有不同的JSON字符串(相同的结构,不同的名称)反序列化为同一类

如何将具有顺序但不同名称的元素用于数组?

如何将XML项反序列化为不同的对象?

使用具有不同元素名称的同一对象反序列化Xml

XML序列化-多个具有相同名称的元素

从具有多个名称空间的XML反序列化选择元素

反序列化XML到具有相同元素名称的派生类?

XSD具有相同名称但类型不同的多个元素

从XSD中的不同名称空间嵌套XML元素

如何在硒中的不同标签中定位具有相同名称和相同属性的元素

Java-Jackson将ArrayList <String>序列化为具有不同子名称的XML

Symfony Serializer不会反序列化为不同名称空间中的对象:“未找到支持的规范化器”