标签: xmldocument

XmlDocument和慢模式处理

我有一个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.我怎样才能解决这些问题?

.net c# xml xmldocument dtd

5
推荐指数
1
解决办法
2774
查看次数

我应该如何管理基于Xml的文档的不同不兼容的形式

我有一个应用程序,它以基于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)

为了防止将来出现支持问题,我想提出一个合适的策略来处理我将来可能做出的更改,以便我现在发布的应用程序版本能够应对这些变化.未来:

  • 文档的"版本号"是否应该存储在文档中,如果是,应该使用哪种版本控制策略?如果文档版本与.exe程序集版本匹配,或者应该使用更复杂的策略,(例如,主要修订版本更改表示重大更改,则较小的修订版增量表示不间断更改 - 例如额外的可选元素)
  • 我应该使用什么方法来阅读文档本身,以及如何避免为不同版本的文档复制大量代码?
    • 尽管XPath显然最灵活,但实现起来要比使用xsd生成类要多得多.
    • 另一方面,如果使用DOM解析,则在源控件中需要每个重大更改的文档xsd的新副本,如果需要将修复程序应用于较旧的模式,则会导致问题(仍支持旧版本的应用程序) .

另外,我假设我所做的所有改变都可以分为"喙变化"和"不间断的变化"这两类,我已经非常松散地工作了所有这些,但我并不完全相信这是一个安全的假设制作.

请注意,我非常宽松地使用术语"文档" - 内容根本不像文档!

感谢您提供给我的任何建议.

c# xml schema xsd xmldocument

5
推荐指数
1
解决办法
367
查看次数

XmlDocument类正在删除格式化,c#,.NET

我想知道是否有人知道如何停止xmldocument.Save()重新格式化文档.

它不是文档格式不正确的XML,我正在使用的特定文档有很多空白和类似的东西 - 保存后 - 都被删除.

c# formatting xmldocument save

5
推荐指数
1
解决办法
2537
查看次数

从XmlDocument XPath查询中获取特定数量的结果

我正在查询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)

asp.net xpath xmldocument

5
推荐指数
2
解决办法
3716
查看次数

如何从XmlDocument对象获取XML元素?

假设使用以下代码成功加载了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元素?谢谢.

.net c# xml linq xmldocument

5
推荐指数
1
解决办法
1万
查看次数

C#:Xml.Load(文件)的close方法

我编写了一些使用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.它就像是忘记从内存中删除其内容.

c# xml memory xmldocument memory-management

5
推荐指数
1
解决办法
3万
查看次数

如何在.NET WCF中使用MessageBuffer对象的WriteMessage(Stream stream)方法?

在试图弄清楚如何将.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)

.net wcf serialization xmldocument soap

5
推荐指数
0
解决办法
1038
查看次数

XPath是否对逻辑表达式进行短路评估?

我的问题是关于XPath中的执行顺序。

我有一个表达式,例如:

//person[@created and customFunction(.)]
Run Code Online (Sandbox Code Playgroud)

我的问题是我的自定义函数计算量很大,我只希望它在具有创建的属性集的节点上运行。会@created一直被评估过customFunction吗?我可以编写一个程序来测试这一点,但实际上,这样的实验是否成功,不能保证,至少从长远来看,不能保证。

如果这是XPath实现的问题,那么我正在使用.NET 4.0。

xpath xmldocument .net-4.0

5
推荐指数
1
解决办法
764
查看次数

以多线程方式使用Delphi7 COM接口时的内存消耗

当以多线程方式访问COM诸如IXMLDocumentIXMLNode/等等的对象接口时,Delphi7中似乎存在一些内存问题.其他人COM interfaces可能会分享这个问题,但我的"研究"并不是那么深刻,因为我必须继续我现在的项目.创建TXMLDocument并通过接口,如操纵它IXMLDocument,并IXMLNode在单个线程上是好的,但在多线程的方法,当一个线程创建的TXMLDocument对象和其他人操纵它使用越来越多的内存.CoInitializeEx(nil, COINIT_MULTITHREADED)在每个线程中调用但是徒劳无功.似乎每个线程得到一个接口时,并没有释放它分配一些内存,但每一次的线程分配给它-至少在某一个接口-例如DocumentElementChildNodes- 所以在创建对象的线程旁边有一个工作线程 - 不会导致可见的内存泄漏.但是,动态创建的线程的行为方式都相同,最终消耗了进程内存.

这是我的完整测试应用程序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)

memory delphi com multithreading xmldocument

5
推荐指数
1
解决办法
578
查看次数

从XmlNode中删除子节点

XPath用来选择一个报告节点.现在我想知道的是如何在不知道哪个节点的子节点的情况下从文档中删除该节点?

我试过调用.RemoveChild它会抛出这个错误:

要删除的节点不是此节点的子节点.

这是我删除节点的代码:

var node = doc.SelectSingleNode("//report");
doc.RemoveChild(node);
Run Code Online (Sandbox Code Playgroud)

c# xmldocument

5
推荐指数
1
解决办法
1816
查看次数