我正在优化自定义对象 - > XML序列化实用程序,它已完成并正常工作,这不是问题.
它通过将文件加载到XmlDocument对象中,然后递归遍历所有子节点来工作.
我认为也许使用XmlReader而不是XmlDocument加载/解析整个事情会更快,所以我也实现了那个版本.
算法完全相同,我使用包装类来抽象处理一个XmlNode与一个的功能XmlReader.例如,GetChildren方法yield返回子项XmlNode或SubTree XmlReader.
所以我写了一个测试驱动程序来测试这两个版本,并使用一个非平凡的数据集(一个900kb的XML文件,大约有1,350个元素).
但是,使用JetBrains dotTRACE,我发现XmlReader版本实际上比XmlDocument版本慢!XmlReader当我在迭代子节点时,似乎在读取调用中涉及一些重要的处理.
所以我要说这一切:
有什么优势/劣势XmlDocument和XmlReader,和你应该使用什么情况下要么?
我的猜测是,文件大小阈值XmlReader在性能上变得更经济,而且内存密集度更低.但是,该阈值似乎超过1MB.
我ReadSubTree每次都在调用处理子节点:
public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
XmlReader xr = myXmlSource.ReadSubtree ();
// skip past the current element
xr.Read ();
while (xr.Read ())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
Run Code Online (Sandbox Code Playgroud)
该测试适用于单个级别的许多对象(即宽和浅) …
我有一个需要极少持久存储的应用程序.实际上,我们谈论的是<30个整数.所有应用程序的需求是在下次启动时知道那些整数(并且整数在运行时会发生变化).
数据库对此来说太过分了,但我并不特别想要使用文本文件.
C#是否有任何机制可以在运行之间保持这样的小值?我注意到你可以将东西存储在资源文件和其他一些地方 - 我不知道你是否可以在运行时更改它们.我刚刚学习C#和.NET来完成一份新工作,所以如果这是一个愚蠢的问题,请道歉!
重复:这是使用C#解析xml文件的最佳实践的副本?和许多其他人(见https://stackoverflow.com/search?q=c%23+parse+xml).请关闭它,不要回答.
如何从C#自下而上解析XML文档?
例如 :
<Employee>
<Name> Test </name>
<ID> 123 </ID>
<Employee>
<Company>
<Name>ABC</company>
<Email>test@ABC.com</Email>
</company>
Run Code Online (Sandbox Code Playgroud)
像这些有很多节点..我需要从下往上开始解析,如...解析<company>然后等等.如何在C#中解决这个问题?
我正在使用dblp XML文件.我实际上想要解析dblp.xml文件,并希望提取有用的信息以供我在某个项目中进一步处理.并且该XML文件非常庞大(1.1 GB),我甚至无法打开此文件.
如果您有dblp.xml的C#解析器,请指导我,或者您可以指导我,或者我们如何解析大型xml文件.
我是一名初学程序员,从C#和Web服务开始.
在Service.cs我的Web服务文件中,我创建了一个ReadXMLFile()方法,我尝试读取现有的XML文件,从中获取数据并将其放入我在IService.cs文件中创建的相应属性(DataMembers).
我的问题是我的代码基本上没有做任何事情.我已经尝试过寻找网站和教程,但实际上并没有太多,特别是像我这样的初学者.任何人都知道我应该怎么做,因为我到目前为止所做的事情显然是错误的.
以下是我的ReadXMLFile()方法.
void ReadXMLFile()
{
XmlTextReader reader = new XmlTextReader("ClassRoll.xml");
reader.Read();
while (reader.Read())
{
if (reader.Name == "id")
{
id = reader.ReadString();
}
else if (reader.Name == "firstname")
{
link = reader.ReadString();
}
else if (reader.Name == "lastname")
{
description = reader.ReadString();
}
else if (reader.Name == "count")
{
description = reader.ReadString();
}
else if (reader.Name == "testscore")
{
description = reader.ReadString();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的xml文件的一个例子
<classroll>
<student>
<id>101010</id>
<lastname>Smith</lastname> …Run Code Online (Sandbox Code Playgroud) 在XML方面,我是初学者.我创建了一个简单的XML文件,并尝试解析它并将值分配给变量.它运作但我使用的方法让我想知道是否有更好的方法,如果你愿意,更优雅,为此任务.有吗?
这是我的XML文件:
<start>
<record>
<var1>hello</var1>
<var2>world</var2>
</record>
<record>
<var1>another</var1>
<var2>one</var2>
</record>
</start>
Run Code Online (Sandbox Code Playgroud)
这是我使用的方法:
string var1 = "", var2 = "";
using(XmlReader r = XmlReader.Create(file))
{
while(r.Read())
{
if (r.MoveToContent() == XmlNodeType.Element)
{
if(r.Name == "record")
{
var1 = "";
var2 = "";
}
else if(r.Name = "var1")
var1 = r.ReadElementString();
else if(r.Name = "var2")
var2 = r.ReadElementString();
}
else if(r.MoveToContent() == XmlNodeType.EndElement && r.Name == "record")
{
Console.WriteLine(var1 + " " + var2);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想获取以下XML中的<lat>和<lng>标记之间的数据:
<viewport>
<southwest>
<lat>41.7450495</lat>
<lng>-87.8859170</lng>
</southwest>
</viewport>
Run Code Online (Sandbox Code Playgroud)
这是更大的XML的一部分:
<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
<status>OK</status>
<result>
<type>locality</type>
<type>political</type>
<formatted_address>Chicago, IL, USA</formatted_address>
<address_component>
<long_name>Chicago</long_name>
<short_name>Chicago</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Cook</long_name>
<short_name>Cook</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Illinois</long_name>
<short_name>IL</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>United States</long_name>
<short_name>US</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>41.8781136</lat>
<lng>-87.6297982</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>41.7450495</lat>
<lng>-87.8859170</lng>
</southwest>
<northeast>
<lat>42.0109012</lat>
<lng>-87.3736794</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>41.6443350</lat>
<lng>-87.9402669</lng>
</southwest>
<northeast>
<lat>42.0231310</lat>
<lng>-87.5236609</lng>
</northeast>
</bounds>
</geometry>
</result>
</GeocodeResponse>
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试使用此代码来解析它:
string url …Run Code Online (Sandbox Code Playgroud) 它应该很简单,但我在将简单的xml文件读入字符串列表时遇到了麻烦.示例xml文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<directorylist>
<dir>c:\TEST1\</dir>
<dir>c:\TEST2\</dir>
</directorylist>
Run Code Online (Sandbox Code Playgroud)
我想读一个LIst.你能推荐最好的读/写方式吗?
日Thnx
c# ×9
xml ×8
.net ×3
parsing ×2
linq ×1
web-services ×1
xml-parsing ×1
xmldocument ×1
xmlreader ×1