上下文:一种现有系统,它基于以各种形式传递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。
答案 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,