gpt4 book ai didi

c# - 反序列化错误 : The XML element 'name' from namespace '' is already present in the current scope

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:59 26 4
gpt4 key购买 nike

这是我第一次使用 XML 序列化,在尝试解决此问题 2 天后,这绝对让我疯狂

反序列化开始时出现此错误:

The XML element 'name' from namespace '' is already present in the current scope. Use XML attributes to specify another XML name or namespace for the element.

错误发生在我代码中的这一行:

Album album = (Album)serializer.Deserialize(reader);

我不知道为什么。没有重复的“名称”节点,所以我就是不明白。这是从来自第 3 方 REST API 的 HttpWebResponse 接收的 XML 文档。

完整代码如下:

我的相册类(我要反序列化的类型):

    public class Album
{
#region Constructors

public Album()
{

}

#endregion

#region ElementConstants

public static class ElementConstants
{
public const string aID = "aid";
public const string Owner = "owner";
public const string AlbumName = "name";
public const string CoverPhotoID = "cover_pid";
public const string CreateDate = "created";
public const string LastModifiedDate = "modified";
public const string Description = "description";
public const string Location = "location";
public const string AlbumURL = "link";
public const string Size = "size";
public const string Visible = "visible";
}

#endregion ElementConstants

#region Public Properties

[XmlArray(ElementName = "photos_GetAlbums_response")]
[XmlArrayItem( "album" )]
public Album[] Albums { get; set; }

[XmlElement (ElementName = ElementConstants.AlbumName, DataType = "string")]
public string AlbumID { get; set; }

[XmlElement(ElementName = ElementConstants.aID, DataType = "int")]
public Int32 CoverPhotoID { get; set; }

[XmlElement(ElementName = ElementConstants.Owner, DataType = "string")]
public string Owner { get; set; }

[XmlElement(ElementName = ElementConstants.AlbumName, DataType = "string")]
public string AlbumName { get; set; }

[XmlElement(ElementName = ElementConstants.aID, DataType = "DateTime")]
public DateTime CreateDate { get; set; }

[XmlElement(ElementName = ElementConstants.LastModifiedDate, DataType = "DateTime")]
public DateTime LastModifiedDate { get; set; }

[XmlElement(ElementName = ElementConstants.Description, DataType = "string")]
public string Description { get; set; }

[XmlElement(ElementName = ElementConstants.Location, DataType = "string")]
public string Location { get; set; }

[XmlElement(ElementName = ElementConstants.AlbumURL, DataType = "string")]
public string Link { get; set; }

[XmlElement(ElementName = ElementConstants.Size, DataType = "size")]
public string Size { get; set; }

[XmlElement(ElementName = ElementConstants.Visible, DataType = "string")]
public string Visible { get; set; }

#endregion
}

我的序列化器类:

    public class Serializer
{
public static Album CreateAlbumFromXMLDoc(XmlDocument doc)
{
// Create an instance of a serializer
var serializer = new XmlSerializer(typeof(Album));
var reader = new StringReader(doc.ToString());

// Deserialize the Xml Object and cast to type Album
Album album = (Album)serializer.Deserialize(reader);

return album;
}
}

我尝试反序列化的 XML(在 VS 中调试时从传递到 CreateAlbumFromXMLDoc 方法的 Xml Doc 对象复制):

<?xml version="1.0" encoding="UTF-8"?>
<photos_GetAlbums_response xsi:schemaLocation="http://api.example.com/1.0/ http://api.example.com/1.0/xxx.xsd" list="true">
<album>
<aid>3231990241086938677</aid>
<cover_pid>7031990241087042549</cover_pid>
<owner>1337262814</owner>
<name>LA</name>
<created>1233469624</created>
<modified>1233469942</modified>
<description>trip to LA</description>
<location>CA</location>
<link>http://www.example.com/album.php?aid=7333&id=1337262814</link>
<size>48</size>
<visible>friends</visible>
</album>
<album>
<aid>7031990241086936240</aid>
<cover_pid>7031990241087005994</cover_pid>
<owner>1337262814</owner>
<name>Wall Photos</name>
<created>1230437805</created>
<modified>1233460690</modified>
<description/>
<location/>
<link>http://www.example.com/album.php?aid=3296&id=1337262814</link>
<size>34</size>
<visible>everyone</visible>
</album>
<album>
<aid>7031990241086937544</aid>
<cover_pid>7031990241087026027</cover_pid>
<owner>1337262814</owner>
<name>Mobile Uploads</name>
<created>1231984989</created>
<modified>1233460349</modified>
<description/>
<location/>
<link>http://www.example.com/album.php?aid=6300&id=1337262814</link>
<size>3</size>
<visible>friends</visible>
</album>
<album>
<aid>7031990241086936188</aid>
<cover_pid>7031990241087005114</cover_pid>
<owner>1337262814</owner>
<name>Christmas 2008</name>
<created>1230361978</created>
<modified>1230362306</modified>
<description>My Album</description>
<location/>
<link>http://www.example.com/album.php?aid=5234&id=1337262814</link>
<size>50</size>
<visible>friends</visible>
</album>
<album>
<aid>7031990241086935881</aid>
<cover_pid>7031990241087001093</cover_pid>
<owner>1637262814</owner>
<name>Hock</name>
<created>1229889219</created>
<modified>1229889235</modified>
<description>Misc Pics</description>
<location/>
<link>http://www.example.com/album.php?aid=4937&id=1637262814</link>
<size>1</size>
<visible>friends-of-friends</visible>
</album>
<album>
<aid>7031990241086935541</aid>
<cover_pid>7031990241086996817</cover_pid>
<owner>1637262814</owner>
<name>Test Album 2 (for work)</name>
<created>1229460455</created>
<modified>1229460475</modified>
<description>this is a test album</description>
<location/>
<link>http://www.example.com/album.php?aid=4547&id=1637262814</link>
<size>1</size>
<visible>everyone</visible>
</album>
<album>
<aid>7031990241086935537</aid>
<cover_pid>7031990241086996795</cover_pid>
<owner>1637262814</owner>
<name>Test Album (for work)</name>
<created>1229459168</created>
<modified>1229459185</modified>
<description>Testing for work</description>
<location/>
<link>http://www.example.com/album.php?aid=4493&id=1637262814</link>
<size>1</size>
<visible>friends</visible>
</album>
</photos_GetAlbums_response>

旁注:只是为了它,我将该 XML 粘贴到 XML Notepad 2007 中,它告诉我:

您的 XML 文档不包含 xml 样式表处理指令。要提供 XSLT 转换,请将以下内容添加到文件顶部并相应地编辑 href 属性:

我不认为这真的意味着它格式不正确或其他什么,只是需要注意一些事情。

所以..

我的最终目标是明显地通过这个该死的错误,并在我可以通过错误后使用上面的代码取回一组专辑。我还想确保我的代码在尝试使用我的 Album 类中的 Album[] 属性或我可能在这里丢失的任何其他内容来检索相册的数组时是正确的。我认为它非常接近并且应该可以工作,但事实并非如此。


跟进。从那以后我就一直在拔头发。

这是最新的。我暂时没有使用一些东西(来自 Marc),比如 Enum 等。我可能会在以后改变它。我还取出了日期时间的东西,因为它看起来很奇怪,而且我没有在没有......至少没有的情况下得到错误。现在的主要问题仍然是我该死的 XML。

我猜它的格式似乎仍然存在问题?除非它掩盖了另一个问题,否则没有线索。这让我发疯。

反序列化开始时出现此错误:

Data at the root level is invalid. Line 1, position 1.

错误发生在我的代码中的这一行:GetAlbumsResponse album = (GetAlbumsResponse)serializer.Deserialize(reader);

我如何将响应写入 XmL 文档:

public static XmlDocument GetResponseXmlDocument(HttpWebResponse response)
{
Stream dataStream = null; // stream from WebResponse
XmlDocument doc = new XmlDocument();

if (doc == null)
{
throw new NullReferenceException("The web reponse was null");
}

// Get the response stream so we can read the body of the response
dataStream = response.GetResponseStream();

// Open the stream using a StreamReader for easy access
StreamReader reader = new StreamReader(dataStream);

// Load response into string variable so that we can then load into an XML doc
string responseString = reader.ReadToEnd();

// Create an XML document & load it with the response data
doc.LoadXml(responseString);

// Final XML document that represents the response
return doc;
}

我的相册类和根级别类(感谢 Marc 的帮助..我现在明白了):

namespace xxx.Entities
{

[Serializable, XmlRoot("photos_GetAlbums_response")]
public class GetAlbumsResponse
{
[XmlElement("album")]
public List<Album> Albums { get; set; }

[XmlAttribute("list")]
public bool IsList { get; set; }
}

public class Album
{
#region Constructors

public Album()
{

}

#endregion

#region ElementConstants

/// <summary>
/// Constants Class to eliminate use of Magic Strings (hard coded strings)
/// </summary>
public static class ElementConstants
{
public const string aID = "aid";
public const string Owner = "owner";
public const string AlbumName = "name";
public const string CoverPhotoID = "cover_pid";
public const string CreateDate = "created";
public const string LastModifiedDate = "modified";
public const string Description = "description";
public const string Location = "location";
public const string AlbumURL = "link";
public const string Size = "size";
public const string Visible = "visible";
}

#endregion ElementConstants

#region Public Properties

[XmlElement (ElementName = ElementConstants.aID, DataType = "string")]
public string AlbumID { get; set; }

[XmlElement(ElementName = ElementConstants.CoverPhotoID, DataType = "int")]
public Int32 CoverPhotoID { get; set; }

[XmlElement(ElementName = ElementConstants.Owner, DataType = "string")]
public string Owner { get; set; }

[XmlElement(ElementName = ElementConstants.AlbumName, DataType = "string")]
public string AlbumName { get; set; }

public string Created { get; set; }

public DateTime Modified { get; set; }

[XmlElement(ElementName = ElementConstants.Description, DataType = "string")]
public string Description { get; set; }

[XmlElement(ElementName = ElementConstants.Location, DataType = "string")]
public string Location { get; set; }

[XmlElement(ElementName = ElementConstants.AlbumURL, DataType = "string")]
public string Link { get; set; }

public string Size { get; set; }

[XmlElement(ElementName = ElementConstants.Visible, DataType = "string")]
public string Visible { get; set; }

#endregion
}
}

我的序列化器类:

namespace xxx.Utilities
{
public class Serializer
{
public static List<Album> CreateAlbumFromXMLDoc(XmlDocument doc)
{
// Create an instance of a serializer
var serializer = new XmlSerializer(typeof(Album));
var reader = new StringReader(doc.ToString());

// Deserialize the Xml Object and cast to type Album
GetAlbumsResponse album = (GetAlbumsResponse)serializer.Deserialize(reader);

return album.Albums;
}
}
}

真正的 XML 传入,我正在尝试反序列化(是的,它确实有 xmlns):

<?xml version="1.0" encoding="UTF-8"?>
<photos_GetAlbums_response xmlns="http://api.example.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.example.com/1.0/ http://api.example.com/1.0/xxx.xsd" list="true">
<album>
<aid>7321990241086938677</aid>
<cover_pid>7031990241087042549</cover_pid>
<owner>1124262814</owner>
<name>Album Test 1</name>
<created>1233469624</created>
<modified>1233469942</modified>
<description>Our trip</description>
<location>CA</location>
<link>http://www.example.com/album.php?aid=7733&id=1124262814</link>
<size>48</size>
<visible>friends</visible>
</album>
<album>
<aid>231990241086936240</aid>
<cover_pid>7042330241087005994</cover_pid>
<owner>1124262814</owner>
<name>Album Test 2</name>
<created>1230437805</created>
<modified>1233460690</modified>
<description />
<location />
<link>http://www.example.com/album.php?aid=5296&id=1124262814</link>
<size>34</size>
<visible>everyone</visible>
</album>
<album>
<aid>70319423341086937544</aid>
<cover_pid>7032390241087026027</cover_pid>
<owner>1124262814</owner>
<name>Album Test 3</name>
<created>1231984989</created>
<modified>1233460349</modified>
<description />
<location />
<link>http://www.example.com/album.php?aid=6600&id=1124262814</link>
<size>3</size>
<visible>friends</visible>
</album>
</photos_GetAlbums_response>

最佳答案

就个人而言,我不会在这里使用常量——它们很难发现错误(而且由于您可能不会重复使用它们,所以不要添加太多)。例如:

    [XmlElement (ElementName = ElementConstants.AlbumName, DataType = "string")]
public string AlbumID { get; set; }
...
[XmlElement(ElementName = ElementConstants.AlbumName, DataType = "string")]
public string AlbumName { get; set; }

我觉得很可疑......

一种更简单的方法是将您想要的 xml 写入文件(例如 foo.xml)并使用:

xsd foo.xml
xsd foo.xsd /classes

然后看foo.cs

关于c# - 反序列化错误 : The XML element 'name' from namespace '' is already present in the current scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/523245/

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