来自 C++ 的 MSXML - 漂亮的打印/缩进新创建的文档
我正在使用 MSXML 解析器编写 XML 文件,并使用从此处下载的包装器: http ://www.codeproject.com/KB/XML/JW_CXml.aspx。 效果很好,除了当我从代码创建一个新文档(因此不从文件加载并修改)时,结果全部在一大行中。 我希望元素能够很好地缩进,以便我可以在文本编辑器中轻松阅读。
谷歌搜索显示很多人都有同样的问题 - 大约在 2001 年左右提出。 回复通常会说“应用 XSL 转换”或“添加您自己的空白节点”。 尤其是最后一个让我兴奋不已 %( 所以我希望在 2008 年有一种更简单的方法来获得漂亮的 MSXML 输出。所以我的问题是:有吗?我该如何使用它?
I'm writing out XML files using the MSXML parser, with a wrapper I downloaded from here: http://www.codeproject.com/KB/XML/JW_CXml.aspx. Works great except that when I create a new document from code (so not load from file and modify), the result is all in one big line. I'd like elements to be indented nicely so that I can read it easily in a text editor.
Googling shows many people with the same question - asked around 2001 or so. Replies usually say 'apply an XSL transformation' or 'add your own whitespace nodes'. Especially the last one makes me go %( so I'm hoping that in 2008 there's an easier way to pretty MSXML output. So my question; is there, and how do I use it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这是已接受答案的修改版本,它将在内存中进行转换(仅在最后几行中进行更改,但为了方便未来的读者,我发布了整个块):
Here's a modified version of the accepted answer that will transform in-memory (changes only in the last few lines but I'm posting the whole block for the convenience of future readers):
即使我的 2 美分在 7 年后到达,我认为这个问题仍然值得一个简单的答案,只需几行代码,这可以通过使用 Visual C++ 的
#import
指令和本机 C++ COM 支持库来实现(提供智能指针并封装错误处理)。请注意,与已接受的答案一样,它不会尝试适应OP正在使用的
CXml
类,而是显示核心思想。 我还假设msxml6
。漂亮地打印到任何流
文件流
如果您需要将流写入文件,则需要实现
IStream
接口。wtlext 有一个类,您可以使用它,或者从中您可以推断出如何编写自己的代码。
另一个对我来说效果很好的简单解决方案是利用 Ado Stream 类:
将其粘合在一起
一个简单的
main
函数显示了这一点:Even my 2 cents arrive 7 years later I think the question still deserves a simple answer wrapped in just a few lines of code, which is possible by using Visual C++'s
#import
directive and the native C++ COM support library (offering smart pointers and encapsulating error handling).Note that like the accepted answer it doesn't try to fit into the
CXml
class the OP is using but rather shows the core idea. Also I assumemsxml6
.Pretty-printing to any stream
File stream
If you need a stream writing to a file you need an implementation of the
IStream
interface.wtlext has got a class, which you can use or from which you can deduce how you can write your own.
Another simple solution that has worked well for me is utilising the Ado Stream class:
Glueing it together
A simplistic
main
function shows this in action:试试这个,我几年前在网上找到的。
Try this, I found this years ago on the web.
除非库有格式选项,否则唯一的其他方法是使用 XSLT,或外部漂亮的打印机(我认为 htmltidy 也可以做 xml)
codeproject 库中似乎没有选项,但您可以指定 MSXML 的 XSLT 样式表。
Unless the library has a format option then the only other way is to use XSLT, or an external pretty printer ( I think htmltidy can also do xml)
There doen't seem to be an option in the codeproject lib but you can specify an XSLT stylesheet to MSXML.
我不久前为基本的 xml 缩进编写了一个 sed 脚本。 如果其他方法都失败,您可以将其用作外部压头(将其保存到 xmlindent.sed,并使用 sed -f xmlindent.sed 处理您的 xml)。 不过,您可能需要 cygwin 或其他一些 posix 环境才能使用它。
这是来源:
Hrmp,选项卡似乎是乱码...您可以从这里复制废物:使用 sed(1) 进行 XML 缩进
I've written a sed script a while back for basic xml indenting. You can use it as an external indenter if all else fails (save this to xmlindent.sed, and process your xml with sed -f xmlindent.sed <filename>). You might need cygwin or some other posix environment to use it though.
Here's the source:
Hrmp, tabs seem to be garbled... You can copy-waste from here instead: XML indenting with sed(1)