如何在MongoDB中存储XML?

时间:2015-07-14 15:36:30

标签: .net json xml mongodb bson

上下文:一种现有系统,它基于以各种形式传递XML(XmlDocument,XDocument / XElement,字符串编码)。我们正在开发一个新组件,它将与现有系统进行通信,并拥有它自己的某种数据存储器,用于保存XML以供以后处理。 MongoDB似乎非常适合数据存储,但它没有对XML的原生支持,所以我想知道在MongoDB中处理XML有什么好的选择。

有两种选择可以想到:

1。使用XML到JSON转换器(双向转换)

我相信这将允许查询MongoDB索引上的数据和创建。不需要立即进行大量查询或进行大量不同类型的查询,但我们至少必须进行一些基于密钥的检索,并且可能对值进行一两次查询会很有用(当然保持该选项打开很有用。

这是一个通用的XML-2-JSON转换器,或者MongoDB / BSON转换器会更好吗?

转换为JSON / BSON有什么特别的缺点吗?它是否会导致信息丢失,或许元素空间块中的空格可能会被破坏?

2。字符串(或二进制)对XML进行编码并将其存储为BSON字节数组。

赞成

  • 简单。

缺点

  • 数据对查询变得不透明。

以上两个选项是否还有其他优点/缺点? 还有其他选择吗? 这是理智的吗?! (例如,有没有比MongoDB更适合这个问题?)

===更新===

使用Newtonsoft.Json进行XML到JSON转换的工作演示......

XElement fooElem = XElement.Load("foo.xml");
// Note. I used Formatting.Indented to make the JSON easily readable for debug purposes, otherwise it just adds unnecessary whitespace characters.
string jsonStr = JsonConvert.SerializeXNode(fooElem, Formatting.Indented);
BsonDocument bsonDoc = BsonDocument.Parse(jsonStr);

从那里你可以照常调用MongoDB,例如:

await collection.InsertOneAsync(bsonDoc);

在我的特定情况下,这可能是一个好的/可接受的解决方案,但更一般地说它有转换然后解析JSON字符串的开销,这是不必要的工作。理想情况下,我们会从XElement直接转到BsonDocument。

1 个答案:

答案 0 :(得分:1)

你说得很好。避免在将JSON持久化到MongoDB之前解析JSON的必要性。您可能已经或可能没有找到解决此一般问题的商业.NET产品(库)。

你是否应该自己实现,FWIW,我最近一直在考虑JSON中的文档顺序友好的XML通用编码,我相信它是可以绕过的,有或没有XML名称空间,并且可能会启发你。

这是PoC,在我对this other question ("xml to json mapping challenge")的回答中:

https://stackoverflow.com/a/35810403/1409653

“HTH,