我正在尝试尽可能快地阅读以下Xml文档,并让其他类管理每个子块的读取.
<ApplicationPool>
<Accounts>
<Account>
<NameOfKin></NameOfKin>
<StatementsAvailable>
<Statement></Statement>
</StatementsAvailable>
</Account>
</Accounts>
</ApplicationPool>
Run Code Online (Sandbox Code Playgroud)
但是,我正在尝试使用XmlReader对象来读取每个帐户,然后使用"StatementsAvailable".你建议使用XmlReader.Read并检查每个元素并处理它吗?
我想过分离我的类来正确处理每个节点.所以这是一个AccountBase类,它接受一个XmlReader实例,该实例读取NameOfKin和该帐户的其他几个属性.然后我想要通过语句进行交互,让另一个类填写有关语句(并随后将其添加到IList).
到目前为止,我通过执行XmlReader.ReadElementString()来完成"每个类"部分,但是我无法训练如何告诉指针移动到StatementsAvailable元素并让我遍历它们并让另一个类读取每个proeprties .
听起来很简单!
我有以下XML文件,文件相当大,我无法让simplexml打开并读取文件所以我正在尝试XMLReader没有成功的PHP
<?xml version="1.0" encoding="ISO-8859-1"?>
<products>
<last_updated>2009-11-30 13:52:40</last_updated>
<product>
<element_1>foo</element_1>
<element_2>foo</element_2>
<element_3>foo</element_3>
<element_4>foo</element_4>
</product>
<product>
<element_1>bar</element_1>
<element_2>bar</element_2>
<element_3>bar</element_3>
<element_4>bar</element_4>
</product>
</products>
Run Code Online (Sandbox Code Playgroud)
遗憾的是,我没有为PHP找到一个很好的教程,我很想知道如何将每个元素内容存储在数据库中.
我正在优化自定义对象 - > 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)
该测试适用于单个级别的许多对象(即宽和浅) …
我正在用C#编写一个GIS客户端工具,以从服务器中检索基于GML的XML模式(下面的示例)中的"功能".提取物限制为100,000个功能.
我猜测最大的extract.xml可能会增加大约150兆字节,所以很明显DOM解析器已经出来我一直试图在XmlSerializer和XSD.EXE生成的绑定之间做出决定--OR-- XmlReader和手工制作的对象图.
或者也许有一种更好的方式我尚未考虑过?像XLINQ,或????
请任何人指导我吗?特别是关于任何给定方法的存储效率.如果不是,我将不得不"原型化"两种解决方案,并将它们并排分析.
我是.NET中的一个原始对象.任何指导将不胜感激.
感谢您.基思.
示例XML - 最多100,000个,每个功能最多234,600个coords.
<feature featId="27168306" fType="vegetation" fTypeId="1129" fClass="vegetation" gType="Polygon" ID="0" cLockNr="51598" metadataId="51599" mdFileId="NRM/TIS/VEGETATION/9543_22_v3" dataScale="25000">
<MultiGeometry>
<geometryMember>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>153.505004,-27.42196 153.505044,-27.422015 153.503992 .... 172 coordinates omitted to save space ... 153.505004,-27.42196</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</geometryMember>
</MultiGeometry>
</feature>
Run Code Online (Sandbox Code Playgroud) 我在尝试解析C#应用程序中的XML文档时遇到此错误:
"出于安全原因,此XML文档中禁止使用DTD.要启用DTD处理,请将XmlReaderSettings上的ProhibitDtd属性设置为false,并将设置传递给XmlReader.Create方法."
作为参考,异常发生在以下代码的第二行:
using (XmlReader reader = XmlReader.Create(uri))
{
reader.MoveToContent(); //here
while (reader.Read()) //(code to parse xml doc follows).
Run Code Online (Sandbox Code Playgroud)
我对Xml的了解非常有限,我不知道DTD处理是什么,也不知道如何做错误消息的建议.有关可能导致此问题以及如何解决问题的任何帮助?谢谢...
我有两个需要的服务XPathDocument.我希望能够定义XPathDocumnet在两个服务的配置中使用的命名实例.我也希望能够告诉StuctureMap使用哪个构造函数XPathDocument.当我尝试获取XPathDocument它的实例时告诉我它无法找到插件类型XmlReader.我想使用需要字符串uri的构造函数来获取xml文件.我似乎无法让这个工作.这是StructureMap配置代码.
public class Service1 : IService1 {
public Service1(XPathDocument document) {}
}
public class Service2 : IService2 {
public Service2(XPathDocument document) {}
}
public class Registry1 : Registry {
ForRequestedType<IService1>().TheDefault.Is.OfConcreteType<Service1>()
.CtorDependency<XPathDocument>()
.Is(x => x.TheInstanceNamed("XPathDocument1"));
ForRequestedType<IService2>().TheDefault.Is.OfConcreteType<Service2>()
.CtorDependency<XPathDocument>()
.Is(x => x.TheInstanceNamed("XPathDocument2"));
ForRequestedType<XPathDocument>().AddInstances(x => {
x.OfConcreteType<XPathDocument>()
.WithCtorArg("uri").EqualToAppSetting("XmlFile1")
.WithName("XPathDocument1");
x.OfConcreteType<XPathDocument>()
.WithCtorArg("uri").EqualToAppSetting("XmlFile2")
.WithName("XPathDocument2");
});
}
Run Code Online (Sandbox Code Playgroud) 我正在用XSD编写XML验证器.
以下是我所做的,但当验证器到达该行时,while (list.Read())它会给我错误
没有Unicode字节顺序标记.无法切换到Unicode.
任何人都可以帮我解决这个问题吗?
public class Validator
{
public void Validate(string xmlString)
{
Boolean bRet = true;
string xmlPath = @"C:\x.xml";
string xsdPath = @"C:\general.xsd";
XmlReaderSettings Settings = new XmlReaderSettings();
Settings.Schemas.Add("", xsdPath);
Settings.ValidationType = ValidationType.Schema;
Settings.ValidationEventHandler +=
new ValidationEventHandler(SettingsValidationEventHandler);
XmlReader list = XmlReader.Create(xmlPath, Settings);
//StringBuilder output = new StringBuilder();
while (list.Read())
{
}
//File.WriteAllText(@"D:\Output.xml", output.ToString());
}
static void SettingsValidationEventHandler(object sender,
ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
MessageBox.Show( "WARNING: ");
MessageBox.Show(e.Message);
}
else if (e.Severity == …Run Code Online (Sandbox Code Playgroud) 我在.NET中使用XmlReader来使用循环解析XML文件:
while (xml.Read()) {
switch xml.NodeType {
case XmlNodeType.Element:
//Do something
case XmlNodeType.Text:
//Do something
case XmlNodeType.EndElement:
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道以下XML代码是否产生一些EndElement节点是否正常?请注意/>之前缺少的空格,但我不认为这是问题所在.
<date month="November" year="2001"/>
<zone name="xml"/>
Run Code Online (Sandbox Code Playgroud)
是否有不同的NodeType或属性来指示自闭元素?
有谁知道我如何获得System.Xml.XmlReader的当前行号?我试图记录文件中我找到Xml元素的位置.
我正在使用第三方DLL,它通过互联网传输XML文档.
为什么DLL会抛出以下异常?
根级别的数据无效.第1行,第1位.(有关完整的异常文本,请参见下文.)
以下是XML文档的前几行:
<?xml version="1.0" encoding="utf-8"?> <REQUEST> <HEADER>
<REQUESTID>8a5f6d56-d56d-4b7b-b7bf-afcf89cd970d</REQUESTID>
<MESSAGETYPE>101</MESSAGETYPE>
<MESSAGEVERSION>3.0.2</MESSAGEVERSION>
Run Code Online (Sandbox Code Playgroud)
例外:
System.ApplicationException was caught
Message=Unexpected exception.
Source=FooSDK
StackTrace:
at FooSDK.RequestProcessor.Send(String SocketServerAddress, Int32 port)
at Foo.ExecuteRequest(Int32 messageID, IPayload payload, Provider prov)
at Foo.SendOrder(Int32 OrderNo)
InnerException: System.Xml.XmlException
LineNumber=1
LinePosition=1
Message=Data at the root level is invalid. Line 1, position 1.
Source=System.Xml
SourceUri=""
StackTrace:
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace)
at System.Xml.XmlDocument.Load(XmlReader reader)
at System.Xml.XmlDocument.LoadXml(String xml) …Run Code Online (Sandbox Code Playgroud) xmlreader ×10
c# ×8
xml ×7
.net ×3
xmldocument ×2
.net-2.0 ×1
line-numbers ×1
parsing ×1
php ×1
simplexml ×1
structuremap ×1
xml-parsing ×1
xsd ×1