C# 解析xml并加载到字典中
我想解析一个使用以下模式的XML文件,提取两个元素“adif”和“name”中的数据,并将它们放在字典中。 我真的不知道如何使用任何内置的.net类或HTML敏捷包来实现这一点 有人能告诉我正确的方向吗? 谢谢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.
我对实体节点以外的任何东西都不感兴趣。其中最多有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")));
}
}
}
}