我已经阅读如何反序列化XML,但还没有想通了,我应该写的代码,以符合我的需求的方式的一些帖子和文章,所以...我道歉另一个问题有关反序列化XML))
我有我需要反序列化大(50 MB)的XML文件。 我用XSD.EXE获得文档的比自动生成的C#类,我把我的项目文件XSD架构。 我想从这个XML文件中的一些(不是全部)的数据,并把它变成我的SQL数据库。
下面是该文件(简体,XSD是非常大)的层次结构:
public class yml_catalog
{
public yml_catalogShop[] shop { /*realization*/ }
}
public class yml_catalogShop
{
public yml_catalogShopOffersOffer[][] offers { /*realization*/ }
}
public class yml_catalogShopOffersOffer
{
// here goes all the data (properties) I want to obtain ))
}
这里是我的代码:
第一种方法:
yml_catalogShopOffersOffer catalog;
var serializer = new XmlSerializer(typeof(yml_catalogShopOffersOffer));
var reader = new StreamReader(@"C:\div_kid.xml");
catalog = (yml_catalogShopOffersOffer) serializer.Deserialize(reader);//exception occures
reader.Close();
我得到InvalidOperationException异常:有一个错误的XML(3,2)文件
第二种方法:
XmlSerializer ser = new XmlSerializer(typeof(yml_catalogShopOffersOffer));
yml_catalogShopOffersOffer result;
using (XmlReader reader = XmlReader.Create(@"C:\div_kid.xml"))
{
result = (yml_catalogShopOffersOffer)ser.Deserialize(reader); // exception occures
}
InvalidOperationException异常:有是XML(0,0)文档中的错误
第三:我想反序列化整个文件:
XmlSerializer ser = new XmlSerializer(typeof(yml_catalog)); // exception occures
yml_catalog result;
using (XmlReader reader = XmlReader.Create(@"C:\div_kid.xml"))
{
result = (yml_catalog)ser.Deserialize(reader);
}
而我得到以下几点:
error CS0030: The convertion of type "yml_catalogShopOffersOffer[]" into "yml_catalogShopOffersOffer" is not possible.
error CS0029: The implicit convertion of type "yml_catalogShopOffersOffer" into "yml_catalogShopOffersOffer[]" is not possible.
那么,如何解决(或覆盖)的代码没有得到异常?
编辑:此外,当我写:
XDocument doc = XDocument.Parse(@"C:\div_kid.xml");
的XmlException occures:上根级别,串1,位置1未经许可的数据。
下面是XML文件的第一个字符串:
<?xml version="1.0" encoding="windows-1251"?>
编辑2:XML文件短例如:
<?xml version="1.0" encoding="windows-1251"?>
<!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2012-11-01 23:29">
<shop>
<name>OZON.ru</name>
<company>?????? "???????????????? ??????????????"</company>
<url>http://www.ozon.ru/</url>
<currencies>
<currency id="RUR" rate="1" />
</currencies>
<categories>
<category id=""1126233>base category</category>
<category id="1127479" parentId="1126233">bla bla bla</category>
// here goes all the categories
</categories>
<offers>
<offer>
<price></price>
<picture></picture>
</offer>
// other offers
</offers>
</shop>
</yml_catalog>
PS我已经acccepted答案(这是完美的)。 但现在我需要找到“基地类别”的使用的categoryId每个发售。 数据是分层的和基座类别是没有“parentId的”属性的类别。 所以,我写了一个递归方法找到了“基础类”,但它永远不会结束。 好像algorythm不是非常快))
这里是我的代码(在main()方法)
var doc = XDocument.Load(@"C:\div_kid.xml");
var offers = doc.Descendants("shop").Elements("offers").Elements("offer");
foreach (var offer in offers.Take(2))
{
var category = GetCategory(categoryId, doc);
// here goes other code
}
Helper方法:
public static string GetCategory(int categoryId, XDocument document)
{
var tempId = categoryId;
var categories = document.Descendants("shop").Elements("categories").Elements("category");
foreach (var category in categories)
{
if (category.Attribute("id").ToString() == categoryId.ToString())
{
if (category.Attributes().Count() == 1)
{
return category.ToString();
}
tempId = Convert.ToInt32(category.Attribute("parentId"));
}
}
return GetCategory(tempId, document);
}
我可以使用递归在这样的情况? 如果没有,怎么我还能找到“基础类”?