0

我需要获取一个巨大的 XML 文件(大约 60 GB)的结构或方案。获得所有属性的最佳方法是什么?

4

3 回答 3

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
                }
            }

于 2021-07-28T13:08:48.137 回答
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> 

来自https://www.w3schools.com/xml/schema_schema.asp的示例

于 2017-03-18T13:05:08.940 回答
0

我建议您从查看 XML 文档开始。获取文档的第一兆字节(初始示例)并添加结束标记,加载到 XML 编辑器中。想一想数据的重复性。

然后使用在线模式生成器或 google 并找到合适的库并生成示例 XML 模式。然后将 XML Schema 加载到流式验证器中,例如Java 中的ValidationHandler,并尝试验证整个文档。

手动将任何“有问题的”XML 片段添加到初始样本中进行几次迭代,重新生成 XML 模式。如果您仍然无法验证整个文档(60 GB),请编写一个工具,以流式方式(在内存中)将文档分成合适的块,例如 20-100 mb 左右。然后将每个示例输入到模式生成器中,并收集 xml 模式的所有不同变体以及相应的示例 XML。换句话说,如果块 3 和 4 的生成 XML 模式相同,则只保留块 3。

您可能希望标准化输出 XML Schema,因此首先忽略基本类型的变体。这取决于 XML 模式生成器。

希望这会将样本缩减为一组更小的文件,您可以将它们组合成一个新样本,通过拆分成更小的块并寻找独特的 XML Schema 再次重复该过程。

于 2017-03-19T20:21:53.257 回答