Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析xml并加载到字典中_C#_Xml_Html Agility Pack - Fatal编程技术网

C# 解析xml并加载到字典中

C# 解析xml并加载到字典中,c#,xml,html-agility-pack,C#,Xml,Html Agility Pack,我想解析一个使用以下模式的XML文件,提取两个元素“adif”和“name”中的数据,并将它们放在字典中。 我真的不知道如何使用任何内置的.net类或HTML敏捷包来实现这一点 有人能告诉我正确的方向吗? 谢谢 我对实体节点以外的任何东西都不感兴趣。其中最多有400个,而例外情况和1000个。 到目前为止,我掌握的代码是 using (WebClient wc = new WebClient()) { wc.DownloadFile("https://secure.clublog.

我想解析一个使用以下模式的XML文件,提取两个元素“adif”和“name”中的数据,并将它们放在字典中。 我真的不知道如何使用任何内置的.net类或HTML敏捷包来实现这一点

有人能告诉我正确的方向吗? 谢谢


我对实体节点以外的任何东西都不感兴趣。其中最多有400个,而例外情况和1000个。 到目前为止,我掌握的代码是

using (WebClient wc = new WebClient())
{
     wc.DownloadFile("https://secure.clublog.org/cty.php?api="API","Test.gz");

           var doc = new HtmlAgilityPack.HtmlDocument();

           using (var file = File.Open("Test.gz", FileMode.Open))
           using (var zip = new GZipStream(file, CompressionMode.Decompress))
           {
               doc.Load(zip);
           }

            Dictionary<string, string> dict = new Dictionary<string, string>();
使用(WebClient wc=new WebClient())
{
wc.DownloadFile(“https://secure.clublog.org/cty.php?api=“API”、“Test.gz”);
var doc=new HtmlAgilityPack.HtmlDocument();
使用(var file=file.Open(“Test.gz”,FileMode.Open))
使用(var zip=new GZipStream(文件,CompressionMode.Decompress))
{
文件加载(zip);
}
Dictionary dict=新字典();
当然,HTML Agility pack没有文档,我对解析XML代码的理解也很有限

这就是我所处的位置: XD包含有效的xml数据

    private void button1_Click(object sender, EventArgs e)
    {
        var dict = (Dictionary<string, decimal>)null;
        using (WebClient wc = new WebClient())
        {

            wc.DownloadFile("https://secure.clublog.org/cty.php?api=", "Test.gz");


            using (var file = File.Open("Test.gz", FileMode.Open))
            {
                using (var zip = new GZipStream(file, CompressionMode.Decompress))
                {

                    using (var xmlReader = XmlReader.Create(zip))
                    {
                        //                            Dictionary<string, decimal> dict = new Dictionary<string, decimal>();

                        var xd = XDocument.Load(xmlReader);


                    }
private void按钮1\u单击(对象发送者,事件参数e)
{
var dict=(字典)null;
使用(WebClient wc=new WebClient())
{
wc.DownloadFile(“https://secure.clublog.org/cty.php?api=“,“Test.gz”);
使用(var file=file.Open(“Test.gz”,FileMode.Open))
{
使用(var zip=new GZipStream(文件,CompressionMode.Decompress))
{
使用(var xmlReader=xmlReader.Create(zip))
{
//Dictionary dict=新字典();
var xd=XDocument.Load(xmlReader);
}
这是xml数据…两条记录。我试图将文件保存在我的服务器上,但它不允许我

<?xml version="1.0" encoding="utf-8" ?>
-<clublog xmlns="http://www.clublog.org/cty/v1.0" date="2014-03-16T08:30:03+00:00">
  -<entities>
-<entity>
  <adif>1</adif>
  <name>CANADA</name>
  <prefix>VE</prefix>

  <deleted>FALSE</deleted>

   <cqz>5</cqz>

 <cont>NA</cont>

  <long>-80.00</long>

  <lat>45.00</lat>

</entity>


-<entity>

  <adif>2</adif>

  <name>ABU AIL IS</name>

<prefix>A1</prefix>

<deleted>TRUE</deleted>

<cqz>21</cqz>

<cont>AS</cont>

<long>45.00</long>
<lat>12.80</lat>
<end>1991-03-30T23:59:59+00:00</end>

-
-
-
1.
加拿大
VE
错误的
5.
NA
-80.00
45
-
2.
阿布·艾尔是
A1
真的
21
作为
45
12.80
1991-03-30T23:59:59+00:00

吉恩基。我刚刚为另一个问题写了一个很好的答案,就像这样。如果你可以使用.NET 3.5,你可以使用linq到xml,这将使这非常容易

让我们开始吧。首先你需要加载你的文档。查看并寻求一些帮助。不过,我认为第二个会对你有更多帮助

现在开始挖掘。由于您对可能只有几层深的节点感兴趣,这应该不会太痛苦。在这一点上,我们遇到了两种设计(我可以想到)一层一层地切掉并将其炸成小块。由于您处理的数据量相当大,所以切掉的速度可能会更快,但可能不会。因此,我将包括这两种设计,并让您从那里进行测试

此设计将假定
doc
表示整个xml文档

削片方法:

var-elements=doc.elements(xs:element)。其中(el=>el.Attribute(“name”).Value==“entities”);

从这里开始,使用
元素()
属性()
的组合应该很简单

爆破方法只是将
Elements()
替换为
substands()
。如果您处理的是近根级别的节点,我会坚持使用爆破方法


现在把它放到一本
字典中
。应该会给你指明正确的方向。它对我来说确实很方便。

类似的东西应该适合你:

var dict = (Dictionary<string, decimal>)null;
using (WebClient wc = new WebClient())
{
    var text = wc.DownloadString(
        "https://secure.clublog.org/cty.php?api=" + API);
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(text)))
    {
        using (var zip = new GZipStream(stream, CompressionMode.Decompress))
        {
            using (var xmlReader = XmlReader.Create(zip))
            {
                var xd = XDocument.ReadFrom(xmlReader);
                dict =
                xd
                    .Document
                    .Root
                    .Element(XName.Get("entities", "http://www.clublog.org/cty/v1.0"))
                    .Elements(XName.Get("entity", "http://www.clublog.org/cty/v1.0"))
                    .ToDictionary(
                        x => x.Element(XName.Get("name", "http://www.clublog.org/cty/v1.0")).Value,
                        x => (decimal)x.Element(XName.Get("adif", "http://www.clublog.org/cty/v1.0")));
            }
        }
    }
}
var dict=(字典)null;
使用(WebClient wc=new WebClient())
{
var text=wc.DownloadString(
"https://secure.clublog.org/cty.php?api=“+API);
使用(var stream=newmemoryStream(Encoding.UTF8.GetBytes(text)))
{
使用(var zip=new GZipStream(stream,CompressionMode.Decompress))
{
使用(var xmlReader=xmlReader.Create(zip))
{
var xd=XDocument.ReadFrom(xmlReader);
口述=
除息的
.文件
.根
.Element(XName.Get(“实体”)http://www.clublog.org/cty/v1.0"))
.Elements(XName.Get(“实体”)http://www.clublog.org/cty/v1.0"))
.ToDictionary(
x=>x.Element(XName.Get(“name”,”http://www.clublog.org/cty/v1.0)价值,
x=>(十进制)x.Element(XName.Get(“adif”,”http://www.clublog.org/cty/v1.0")));
}
}
}
}
我假设您实际上想要一本“adif”类型的
词典,但如果我错了,应该很容易更改


我的方法避免了对文件的所有干扰。

为什么要使用HTML Agility Pack解析XML?您能提供一个您想要解析的实际XML的示例吗?您好,我尝试了您的代码,并在行中使用(var xmlReader=XmlReaderCreate(zip)我收到一个InvalidDataException错误“GZip头中的幻数不正确”)。如果我尝试使用基于文件的代码,则会收到一个有关幻数的错误。对不起,如果我使用基于文件的代码,则会收到一个错误,即xmlready必须是交互式的?Thanks@Tom我认为这两种解决方案的麻烦在于xml数据是UTF-16-8是理想的。你可以阅读更多的信息
var dict = (Dictionary<string, decimal>)null;
using (WebClient wc = new WebClient())
{
    var text = wc.DownloadString(
        "https://secure.clublog.org/cty.php?api=" + API);
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(text)))
    {
        using (var zip = new GZipStream(stream, CompressionMode.Decompress))
        {
            using (var xmlReader = XmlReader.Create(zip))
            {
                var xd = XDocument.ReadFrom(xmlReader);
                dict =
                xd
                    .Document
                    .Root
                    .Element(XName.Get("entities", "http://www.clublog.org/cty/v1.0"))
                    .Elements(XName.Get("entity", "http://www.clublog.org/cty/v1.0"))
                    .ToDictionary(
                        x => x.Element(XName.Get("name", "http://www.clublog.org/cty/v1.0")).Value,
                        x => (decimal)x.Element(XName.Get("adif", "http://www.clublog.org/cty/v1.0")));
            }
        }
    }
}