我还没有找到使用 .NET 的 XmlWriter 和关联的 XmlWriterSettings 以缩进形式格式化 XML 字符串的方法,这与 Visual Studio 使用其自动格式化命令(Ctrl-E Ctrl-D,或者,取决于在键盘映射上,Ctrl-K Ctrl-D)。
我想这样做是因为我习惯性地在 VS 中自动格式化我的所有文件,包括代码和 .config 文件。我有一个更新 .config 文件的安装程序应用程序,我希望看到实际的差异,而不是更改整个文档。
我还没有研究自动格式的所有不同格式设置选项,但我喜欢每个 XML 属性都在单独的一行上,第一个与开始标记在同一行,随后的与第一个对齐,像这样:
<asset assetId="12345"
bucket="default"
owner="nobody">
<file path="\\localhost\share\assetA.mov"/>
<metadata metadataId="23456"
key="asset_type"
value="video"/>
</asset>
我已经尝试使用 XmlWriterSettings 属性“NewLineHandling = NewLineHandling.None”和“NewLineOnAttributes = true”进行格式化,但这会将第一个属性放在开始标记下方,并且所有属性都具有相同的缩进,无论字符中的字符数如何元素名称,像这样:
<asset
assetId="12345"
bucket="default"
owner="nobody">
<file
path="\\localhost\share\assetA.mov" />
<metadata metadataId="23456"
key="asset_type"
value="video" />
</asset>
请注意,标准 XmlWriter 也以“/>”(斜杠前的额外空格)结束仅属性元素,我不喜欢这种做法,但不确定这是否是 XML 标准。我认为 Visual Studio 使用开发人员可以随时使用的相同 API 选项,但我还没有找到那些神奇的设置。不管怎样,这是我的格式化方法:
public static string FormatXml( string xmlString, bool indented )
{
using ( TextReader textReader = new StringReader( xmlString ) )
using ( XmlReader xmlReader = new XmlTextReader( textReader ) )
{
using ( TextWriter textWriter = new StringWriter() )
{
var settings = new XmlWriterSettings();
if ( indented )
{
settings.Indent = true;
settings.IndentChars = " ";
settings.NewLineOnAttributes = true;
settings.NewLineHandling = NewLineHandling.None;
}
using ( var xmlWriter = XmlWriter.Create( textWriter, settings ) )
{
while ( xmlReader.Read() )
xmlWriter.WriteNode( xmlReader, false );
}
return textWriter.ToString();
}
}
}
最佳答案
我误解了这个问题。实际上我不知道是否有办法按照您显示的方式对齐属性。你可以尝试自己实现它,像这样:
public static string FormatXml(string xmlString, bool indented)
{
using (TextReader textReader = new StringReader(xmlString))
using (XmlReader xmlReader = new XmlTextReader(textReader))
{
using (TextWriter textWriter = new StringWriter())
{
string indent = "";
string attributeIndent = "";
while (xmlReader.Read())
{
if (xmlReader.NodeType == XmlNodeType.Element)
{
attributeIndent = "";
string element = xmlReader.Name;
textWriter.Write("{0}<{1}", indent, element);
if (!xmlReader.HasAttributes)
textWriter.WriteLine(">");
else
{
int actual = 1;
while (xmlReader.MoveToNextAttribute())
{
string content = String.Format("{0} {1}={2}", attributeIndent, xmlReader.Name, xmlReader.Value);
if (actual != xmlReader.AttributeCount)
textWriter.WriteLine(content);
else
textWriter.Write(content);
if (string.IsNullOrEmpty(attributeIndent))
attributeIndent = indent + Enumerable.Repeat<string>(" ", element.Length + 1).Aggregate((a, b) => a + b);
actual++;
}
xmlReader.MoveToElement();
textWriter.WriteLine(">");
attributeIndent = "";
}
if (!xmlReader.IsEmptyElement)
{
indent += " ";
textWriter.WriteLine(">");
}
else
textWriter.WriteLine("/>");
}
else if (xmlReader.NodeType == XmlNodeType.EndElement)
{
indent = indent.Substring(0, indent.Length - 2);
textWriter.WriteLine("{0}</{1}>", indent, xmlReader.Name);
}
else if (xmlReader.NodeType == XmlNodeType.Text)
{
textWriter.WriteLine(xmlReader.Value);
}
}
return textWriter.ToString();
}
}
}
关于.net - 以编程方式以缩进形式格式化 XML,就像 Visual Studio 的自动格式化一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4249830/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s