C# XML反序列化<;rss xmlns=''&燃气轮机;出乎意料
另一个 我已经查看了许多关于堆栈溢出的其他示例,但还没有找到一个解决方案 错误:C# XML反序列化<;rss xmlns=''&燃气轮机;出乎意料,c#,xml,rss,deserialization,C#,Xml,Rss,Deserialization,另一个 我已经查看了许多关于堆栈溢出的其他示例,但还没有找到一个解决方案 错误: There is an error in XML document (1, 41). System.Xml at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) at System.Xml.S
There is an error in XML document (1, 41).
System.Xml
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
at CatalogInterface_1_1.MainWindow.cmdConvertToGoogle_Click(Object sender, RoutedEventArgs e) in C:\Users\Jamie.Marshall\Documents\Visual Studio 2015\Projects\CatalogInterface_1_1\CatalogInterface_1_1\MainWindow.xaml.cs:line 239
<rss xmlns=''> was not expected.
这东西快把我累死了,我已经用了好几个小时了
有趣的是,我通常使用的go-to工具是将我的XML和past special复制到VS Studio中,然后查看VS Studio将自动构建的类来反序列化它。在本例中,它与我的代码完全相同。非常混乱 由于utf-16,出现错误。只需从StringReader中读取一行即可跳过该行
FBCatalog.googleRss dataObject = new FBCatalog.googleRss();
using (StringReader sReader = new StringReader(xml.InnerXml))
{
sReader.ReadLine();
XmlReader reader = XmlReader.Create(sReader);
var serializer = new XmlSerializer(typeof(FBCatalog.googleRss), "rss");
dataObject = (FBCatalog.googleRss)serializer.Deserialize(reader);
GCatalog.Page page = new GCatalog.Page();
counter = 0;
foreach (var ITEM in dataObject.Channel.Items)
{
GCatalog.Item gItem = GCatalog.ConvertToGItem(ITEM);
page.Add(gItem);
}
}
问题在于名称空间。XML中的
rss
元素位于默认名称空间中,但是googleRss
上的XmlRoot
属性的名称空间为http://base.google.com/ns/1.0
xmlns:g=“…”
的名称空间声明将名称空间绑定到前缀g
,但在您的问题中的XML片段中没有使用该名称空间
从XmlRoot
属性中删除Namespace
值:
[XmlRoot(ElementName = "rss")]
public partial class googleRss
并从序列化程序构造函数中删除默认名称空间rss
:
var serializer = new XmlSerializer(typeof(GCatalog.googleRss));
请参阅以获取演示。效果非常好。很明显。。。我没有尝试从rss标记中删除名称空间和从序列化程序中删除rss根的组合。我知道第一部分,但为什么是第二部分?为什么为序列化程序声明我的根会出错?@jamiemall你不是在序列化程序中声明根。将
rss
传递给正在设置默认名称空间。这相当于将NamespaceName=“rss”
添加到XmlRoot
属性中。
FBCatalog.googleRss dataObject = new FBCatalog.googleRss();
using (StringReader sReader = new StringReader(xml.InnerXml))
{
sReader.ReadLine();
XmlReader reader = XmlReader.Create(sReader);
var serializer = new XmlSerializer(typeof(FBCatalog.googleRss), "rss");
dataObject = (FBCatalog.googleRss)serializer.Deserialize(reader);
GCatalog.Page page = new GCatalog.Page();
counter = 0;
foreach (var ITEM in dataObject.Channel.Items)
{
GCatalog.Item gItem = GCatalog.ConvertToGItem(ITEM);
page.Add(gItem);
}
}
[XmlRoot(ElementName = "rss")]
public partial class googleRss
var serializer = new XmlSerializer(typeof(GCatalog.googleRss));