我正在尝试编写一个 XML 文件,但它太大而无法存储在内存中,因此我想直接将其写入磁盘。我曾尝试使用 XmlWriter,但没有使我能够追加到文件末尾的功能,因此我愿意求助于使用常规文件编写器编写 XML raw。
有谁知道有什么文件写入类可以让我直接写入磁盘并且可以覆盖文件内的位置吗?
原因是我需要能够覆盖根元素的结尾,以便我可以附加另一位信息,但也能够在需要时读取 XML 文件。例如,如果我有以下 XML:
<elements>
<element>
</element>
</elements>
如果我想读这个,我可以,但如果我想写它,我必须先删除 </elements>标记,追加另一个元素,然后再次追加结束标记。
感谢您的帮助。
最佳答案
您可以使用 XmlTextWriter。
只需打开文件进行写入,返回到结束元素的开头,然后使用 XmlTextWriter 追加您想要的任何新元素。要关闭文件,只需为结束元素编写原始文本以使文档完整即可。
这是一个简单而肮脏的例子。
像这样从 XML 开始:
<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
<FirstElem/>
</DocumentElement>
您可以打开它并附加一个元素,如下所示:
using (FileStream f = new FileStream(@"D:\a.xml", FileMode.OpenOrCreate, FileAccess.Write))
{
f.Seek(-("</DocumentElement>\n".Length), SeekOrigin.End);
using (XmlTextWriter x = new XmlTextWriter(f, Encoding.UTF8))
{
x.WriteStartElement("Another");
x.WriteAttributeString("attr", "value");
x.WriteEndElement();
// Close the file with a new terminating end-element
x.WriteRaw("\r\n</DocumentElement>\r\n");
}
}
结果是:
<?xml version="1.0" encoding="utf-8"?>
<DocumentElement>
<FirstElem/>
<Another attr="value" />
</DocumentElement>
您可能无法获得完美的缩进等,但它是有效的 XML。如果将 xml 作为原始文本写入文件,这正是您要做的 - 但您也可以利用 XML 编写器为您进行格式化。
我也同意一些评论 - 为您的 xml 使用最小化大小的模式将非常有益。关闭缩进。尽可能使用最短的元素和属性名称。如果您正在处理叶元素,将数据存储为属性而不是 cdata 将节省空间(<element>data</element> 比 <element val="data"/> 更昂贵并且可以进一步压缩到 <e v="data"/> - 几乎是原始大小的一半)
关于c# - 将 XML 直接写入磁盘并追加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252974/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm
在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c