如何读取YML提要 - 或者如果读取为XML则忽略DOCType

时间:2013-08-28 14:14:38

标签: c# xml yaml

好的,我希望这不会让人感到困惑。

我们已经提供了YML格式的俄罗斯零售商提供的Feed,我需要阅读并输入我的数据库。我之前没有使用过YML,说实话我并不真正理解它是什么或它与XML有什么不同(我们更喜欢使用但不幸的是零售商不能以这种格式提供它)。我试过谷歌如何读取YML文件,我遇到的是YAML,我提供的文件看起来不像。

因为我没有运气找到YMl我已经将它作为XML下载并尝试阅读但是添加了以下行:

<!DOCTYPE yml_catalog SYSTEM "shops.dtd">

因此我无法读取节点 - 我已手动删除此行,然后可以成功读取我想要的节点。

以下是该文件的摘录:

下载前:

<yml_catalog date="2013-08-28 14:50">
<shop>
<name>DomProm.ru</name>
<company>DomProm.ru</company>
<url>http://www.domprom.ru</url>
<currencies>
<currency id="RUB" rate="1"/>
<currency id="USD" rate="33.4"/>
<currency id="EUR" rate="37.1"/>
</currencies>
<categories>
<category id="28">Крупная бытовая техника</category>
<category id="29" parentId="28">Стиральные машины</category>   
</categories>
<offers>
<offer id="27232" type="vendor.model" available="true">

下载后:

<?xml version="1.0" encoding="windows-1251"?><!DOCTYPE yml_catalog SYSTEM "shops.dtd">
<yml_catalog date="2013-08-28 17:00">
<shop>
<name>DomProm.ru</name>
<company>DomProm.ru</company>
<url>http://www.domprom.ru</url>
<currencies>
<currency id="RUB" rate="1"/>
<currency id="USD" rate="33.4"/>
<currency id="EUR" rate="37.1"/>
</currencies>
<categories>
<category id="28">Êðóïíàÿ áûòîâàÿ òåõíèêà</category>
<category id="29" parentId="28">Ñòèðàëüíûå ìàøèíû</category>
<category id="30" parentId="28">Ïîñóäîìîå÷íûå ìàøèíû</category>
<category id="31" parentId="28">Õîëîäèëüíèêè/Ìîðîçèëüíûå êàìåðû/Âèííûå øêàôû</category>
</categories>
<offers>
<offer id="27232" type="vendor.model" available="true">

以下是我用来阅读它的一些代码:

var document = new XmlDocument();

            try
            {
                // and load it with the contents of that file
                document.Load(downloadFileName);
            }
            catch (Exception ex)
            {
                _keepItDry.WriteToEventLog(ex);
                // Trying to catch what is going on while the progrem is trying to load the downloaded file
                _keepItDry.AddTolistBox(DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString() + " Error loading the file for " + scrape.Retailer.Description + " : " + ex.Message + " " + ex.StackTrace, _listBoxLog);
        }



 var domPromNodes = document.SelectNodes("//yml_catalog//shop//offers/offer");
                    if (domPromNodes != null)
                    {
                        foreach (XmlNode node in domPromNodes)
                        {
                            var title = "No Title"; var price = "No Price"; var modelNo = "No ModelNo"; var sku = "No Sku"; var inStock = "No Instock";
                            var deeplink = "No Deeplink"; var imageUrl = "No ImageUrl"; var brand = "No Brand";

如果取出doctype行var domPromNodes = document.SelectNodes(“// yml_catalog // shop // offers / offer”);返回结果否则失败。

任何帮助或指向YML的指针都会受到赞赏,或者是一种删除或忽略的方法

感谢

1 个答案:

答案 0 :(得分:0)

要忽略使我无法看到节点的doctype,我添加了以下内容:

  XmlDocument doc = new XmlDocument();
                    doc.LoadXml(Regex.Replace(File.ReadAllText(downloadFileName), "<!DOCTYPE.+?>", string.Empty));

因此,这删除了DOCTYPE行,因此允许我读取节点