我需要获取一个巨大的XML文件(大约60 GB)的结构或方案。什么是获得所有属性的最佳方式?
答案 0 :(得分:0)
尝试阅读前几行并检查它是否包含方案声明。
你可以通过简单地匹配字符串"<xs:schema "
来做到这一点
例如。比如这个
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">
...
...
</xs:schema>
的示例
答案 1 :(得分:0)
我建议你先从盯着XML文档开始。获取文档的第一兆字节(初始样本)并添加结束标记,加载到XML编辑器中。对数据的重复性进行一些思考。
然后使用在线模式生成器或google,找到合适的库并生成示例XML Schema。然后将XML Schema加载到流式验证器中,例如Java中的ValidationHandler,并尝试验证整个文档。
进行一些手动包含任何违规行为的迭代&#39; XML片段到初始样本,重新生成XML Schema。如果仍然无法使整个文档(60 GB)验证,请编写一个工具,以流式方式(在内存中)将文档拆分为合适的块,例如20-100 mb左右。然后将每个示例提供给模式生成器,并收集xml模式的所有不同变体以及相应的示例XML。换句话说,如果块3和4的结果XML Schema相同,则只保留chunk 3.
您可能希望规范化输出XML架构,因此首先忽略基本类型的变体。这取决于XML模式生成器。
希望这会将样本分解为更小的文件集,您可以将这些文件组合到一个新的样本中,再次重新分配流程,分成更小的块并寻找独特的XML Schema。
答案 2 :(得分:0)
using (var zipArchive = ZipFile.Open(file.FullName, ZipArchiveMode.Read))
using (var reader = XmlReader.Create(zipArchive.Entries.First().Open()))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
XmlSchemaInference inference = new XmlSchemaInference();
XmlSchemaSet schemaSet = inference.InferSchema(reader);
// Display the inferred schema.
Console.WriteLine("Original schema:\n");
foreach (XmlSchema schema in schemaSet.Schemas())
{
schema.Write(Console.Out);
//or save it to file
}
}