我有一个xml模板文档,我需要加载到XmlDocument中.例如
myXMLDocument.Load(myXMLFile);
Run Code Online (Sandbox Code Playgroud)
然而,这在dtd中加载时非常慢.我已经尝试了两个"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"和dtd的本地副本.两者都或多或少地同时进行.如果我通过将解析器设置为null(例如)来加载dtd,那么我会收到错误,例如"Reference to undeclared entity 'nbsp'"文档是否包含这些错误.
我需要使用XmlDocument,因为我需要在输出文档之前操作DOM.我怎样才能解决这些问题?
我有一个应用程序,它以基于Xml的格式保存文档(想想word文档) - 目前从xsd文件生成的C#类用于读取/写入文档格式,直到最近我必须更改格式该文件.我担心的是后向兼容性,因为我的应用程序的未来版本 需要能够读取所有以前版本保存的文档,理想情况下我还希望我的应用程序的旧版本能够优雅地处理阅读未来版本的应用程序保存的文档.
例如,假设我更改了我的文档的模式以在某处添加(可选的)额外元素,那么我的应用程序的旧版本将忽略额外的元素并且不会出现问题:
<doc>
<!-- Existing document -->
<myElement>Hello World!</myElement>
</doc>
Run Code Online (Sandbox Code Playgroud)
但是,如果进行了重大更改(例如,将属性更改为元素或元素集合),那么我的应用程序的过去版本应该忽略此元素(如果它是可选的),或者通知用户他们正在尝试请阅读使用我的应用程序的较新版本保存的文档.此外,这使我头疼,因为我的应用程序的所有未来版本需要完全单独的代码才能阅读两个不同的文档.
这种变化的一个例子是以下xml:
<doc>
<!-- Existing document -->
<someElement contents="12" />
</doc>
Run Code Online (Sandbox Code Playgroud)
改为:
<doc>
<!-- Existing document -->
<someElement>
<contents>12</contents>
<contents>13</contents>
</someElement>
</doc>
Run Code Online (Sandbox Code Playgroud)
为了防止将来出现支持问题,我想提出一个合适的策略来处理我将来可能做出的更改,以便我现在发布的应用程序版本能够应对这些变化.未来:
另外,我假设我所做的所有改变都可以分为"喙变化"和"不间断的变化"这两类,我已经非常松散地工作了所有这些,但我并不完全相信这是一个安全的假设制作.
请注意,我非常宽松地使用术语"文档" - 内容根本不像文档!
感谢您提供给我的任何建议.
我想知道是否有人知道如何停止xmldocument.Save()重新格式化文档.
它不是文档格式不正确的XML,我正在使用的特定文档有很多空白和类似的东西 - 保存后 - 都被删除.
我正在查询Twitter RSS提要并将结果提供给Repeater进行显示.我只想获得XPath查询的前5个结果.有没有办法在XPath语法中做到这一点,或者我必须循环结果XmlNodeList以拉出前5?
XmlDocument doc = new XmlDocument();
XmlTextReader reader = new XmlTextReader(rssPath);
doc.Load(reader);
XmlNodeList items = doc.SelectNodes("/rss/channel/item");
rptTwitter.ItemDataBound += new RepeaterItemEventHandler(rptTwitter_ItemDataBound);
rptTwitter.DataSource = items;
rptTwitter.DataBind();
Run Code Online (Sandbox Code Playgroud) 假设使用以下代码成功加载了XmlDocument:
var doc = new XmlDocument();
doc.Load(stream);
Run Code Online (Sandbox Code Playgroud)
这是XML流的示例部分(完整的XML流有大约10000个ProductTable):
<ProductTable>
<ProductName>Chair</ProductName>
<Price>29.5</Price>
</ProductTable>
Run Code Online (Sandbox Code Playgroud)
使用Linq,如何访问ProductName和Price元素?谢谢.
我编写了一些使用XmlDocument对象加载XML文档的代码,以便计算它的节点.这是方法:
XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
number_of_childs++;
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,在导入大文件时,需要700MB的RAM.如果我然后尝试对文件执行某些操作,或者甚至从中读取以在a中显示其数据ListView,则应用程序需要2GB的RAM.所以,我想知道,有没有一种方法可以关闭XmlDocument并释放内存,释放RAM.它就像是忘记从内存中删除其内容.
在试图弄清楚如何将.NET System.ServiceModel.Channels.Message对象转换为XmlDocument时,我想我可以这样做:
Message message = Message.CreateMessage(messageVersion, "SOAPAction");
using(var messageBuffer = message.CreateBufferedCopy(int.MaxValue))
{
var stream = new MemoryStream();
using(var xmlWriter = XmlWriter.Create(stream))
{
var xmlDocument = new XmlDocument();
messageBuffer.WriteMessage(stream);
stream.Flush();
stream.Position = 0;
xmlDocument.Load(stream);
stream.Close();
Debug.Writeline(xmlDocument.OuterXml);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会导致xmlDocument.Load(stream)出错:
"Data at the root level is invalid. Line 1, position 1."
Run Code Online (Sandbox Code Playgroud)
我现在意识到我应该使用Message对象的WriteMessage与XmlWriter对象一起使用,如下所示:
Message message = Message.CreateMessage(messageVersion, "SOAPAction");
using(var messageBuffer = message.CreateBufferedCopy(int.MaxValue))
{
var stream = new MemoryStream();
using(var xmlWriter = XmlWriter.Create(stream))
{
var xmlDocument = new XmlDocument();
messageBuffer.CreateMessage().WriteMessage(xmlWriter);
xmlWriter.Flush();
stream.Flush();
stream.Position = …Run Code Online (Sandbox Code Playgroud) 我的问题是关于XPath中的执行顺序。
我有一个表达式,例如:
//person[@created and customFunction(.)]
Run Code Online (Sandbox Code Playgroud)
我的问题是我的自定义函数计算量很大,我只希望它在具有创建的属性集的节点上运行。会@created一直被评估过customFunction吗?我可以编写一个程序来测试这一点,但实际上,这样的实验是否成功,不能保证,至少从长远来看,不能保证。
如果这是XPath实现的问题,那么我正在使用.NET 4.0。
当以多线程方式访问COM诸如IXMLDocument和IXMLNode/等等的对象接口时,Delphi7中似乎存在一些内存问题.其他人COM interfaces可能会分享这个问题,但我的"研究"并不是那么深刻,因为我必须继续我现在的项目.创建TXMLDocument并通过接口,如操纵它IXMLDocument,并IXMLNode在单个线程上是好的,但在多线程的方法,当一个线程创建的TXMLDocument对象和其他人操纵它使用越来越多的内存.CoInitializeEx(nil, COINIT_MULTITHREADED)在每个线程中调用但是徒劳无功.似乎每个线程得到一个接口时,并没有释放它分配一些内存,但每一次的线程分配给它-至少在某一个接口-例如DocumentElement或ChildNodes- 所以在创建对象的线程旁边有一个工作线程 - 不会导致可见的内存泄漏.但是,动态创建的线程的行为方式都相同,最终消耗了进程内存.
这是我的完整测试应用程序Delphi7 form作为SCCE,它试图显示上面提到的三个不同场景 - 单线程,一个工作线程和动态创建的线程.
unit uComTest;
interface
uses
Windows, SysUtils, Classes, Forms, ExtCtrls, Controls, StdCtrls, XMLDoc, XMLIntf, ActiveX;
type
TMyThread = class(TThread)
procedure Execute;override;
end;
TForm1 = class(TForm)
btnMainThread: TButton;
edtText: TEdit;
Timer1: TTimer;
btnOneThread: TButton;
btnMultiThread: TButton;
Timer2: TTimer;
chkXMLUse: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure btnMainThreadClick(Sender: TObject);
procedure …Run Code Online (Sandbox Code Playgroud) 我XPath用来选择一个报告节点.现在我想知道的是如何在不知道哪个节点的子节点的情况下从文档中删除该节点?
我试过调用.RemoveChild它会抛出这个错误:
要删除的节点不是此节点的子节点.
这是我删除节点的代码:
var node = doc.SelectSingleNode("//report");
doc.RemoveChild(node);
Run Code Online (Sandbox Code Playgroud)