首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用URL中的C#反序列化XML

使用URL中的C#反序列化XML
EN

Stack Overflow用户
提问于 2016-01-26 19:40:21
回答 4查看 2.9K关注 0票数 3

我从一个网站上拉出一个XML-Sitemap来解析它。

最简单的方法是将其反序列化为on objet。

我在示例代码的最后一行抛出了错误"Error in XML-Document“。有人知道为什么。错误消息中没有更多细节。

到目前为止我的代码:

代码语言:javascript
复制
[Serializable, XmlRoot("urlset")]
public class Urlset
{
    public B5_Url[] urls;
}
[XmlType("url")]
public class B5_Url
{
    [XmlElement("loc")]
    public string loc;
    [XmlElement("lastmod")]
    public string lastmod;
    [XmlElement("changefreq")]
    public string changefreq;
}
class Program
{
    static void Main(string[] args)
    {
        string url = "http://www.myurl.de/sitemap.xml";

        XmlSerializer ser = new XmlSerializer(typeof(Urlset));

        WebClient client = new WebClient();

        string data = Encoding.Default.GetString(client.DownloadData(url));

        Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(data));

        Urlset reply = (Urlset)ser.Deserialize(stream);  
    }
}

这是XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9             http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
  <loc>http://www.myurl.de/</loc>
  <lastmod>2012-06-25T17:10:30+00:00</lastmod>
  <changefreq>always</changefreq>
</url>
</urlset>

感谢您的帮助:)

EN

回答 4

Stack Overflow用户

发布于 2016-01-26 20:20:27

你应该按照@vitalygolub的建议去做。此外,由于在根元素中设置了Namespace,您仍然会得到一个错误。要修复它,请执行以下操作:

代码语言:javascript
复制
[XmlRoot("urlset", Namespace="http://www.sitemaps.org/schemas/sitemap/0.9")]
public class Urlset
{
    [XmlElement("url")]
    public B5_Url[] urlset;
}

public class B5_Url
{
    [XmlElement("loc")]
    public string loc;
    [XmlElement("lastmod")]
    public string lastmod;
    [XmlElement("changefreq")]
    public string changefreq;
}

我测试了这段代码,它可以处理你的输入。

票数 4
EN

Stack Overflow用户

发布于 2016-01-26 19:41:45

如果这就是您的XML,那么您将缺少一个结束的</url>

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9             http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
  <loc>http://www.myurl.de/</loc>
  <lastmod>2012-06-25T17:10:30+00:00</lastmod>
  <changefreq>always</changefreq>
</url>
</urlset>

我得到了错误<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'> was not expected.

更改:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">

<urlset>

使其不会出错。

这是我的linqpad工作示例

代码语言:javascript
复制
[Serializable, System.Xml.Serialization.XmlRoot("urlset")]
public class Urlset
{
    [System.Xml.Serialization.XmlElement("url")]
    public B5_Url[] urls;
}
[System.Xml.Serialization.XmlType("url")]
public class B5_Url
{
    [System.Xml.Serialization.XmlElement("loc")]
    public string loc;
    [System.Xml.Serialization.XmlElement("lastmod")]
    public string lastmod;
    [System.Xml.Serialization.XmlElement("changefreq")]
    public string changefreq;
}
class Program
{
    static void Main(string[] args)
    {
        var data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><urlset><url><loc>http://www.myurl.de/</loc><lastmod>2012-06-25T17:10:30+00:00</lastmod><changefreq>always</changefreq></url></urlset>";

        var ser = new System.Xml.Serialization.XmlSerializer(typeof(Urlset));

        Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(data));

        Urlset reply = (Urlset)ser.Deserialize(stream);  
        reply.Dump();
    }
}

我必须进行的另一个更改是UrlSetB5_Url[]数组的[System.Xml.Serialization.XmlElement("url")]属性

票数 1
EN

Stack Overflow用户

发布于 2016-01-26 19:50:20

您必须提供以下内容

代码语言:javascript
复制
[Serializable, XmlRoot("urlset")]
public class Urlset
{
    [XmlElement("url")]
    public B5_Url[] urls;
}

它会将集合中的每个元素直接序列化到根元素中,而不是urls-element中。

编辑:但是,您可以从B5_Url中省略XmlType-attribute。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35013021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档