XML 文件的 XSD 规范可以共享公共(public)元素。如果我有多个 XML 文件共享一个公共(public)元素,有没有一种方法可以提取公共(public)元素而无需为每个 XML 文件类型重复代码?
例如:有许多通过 XSD 定义的 XML 文件,具有共同的描述元素,但其他地方的内容结构不同。描述包含作者、日期等子元素。当我为每个 XML 文件创建类型提供程序时,类型是不同的,所以如果我只想从每个文件中提取描述部分,代码必须是为每种类型复制粘贴。
XML 文件 1:
<root>
<description >
<author> Me </author>
</description>
<element > Data </element>
<otherelement> Data </otherelement>
</root>
XML 文件 2:
<root2>
<description >
<author> Me </author>
</description>
<elem > Data </elem>
<diffelem> Data </diffelem >
</root2>
要求代码是这样的:
type File1 = XmlProvider<""".\file1.xml""">
type File2 = XmlProvider<""".\file2.xml""">
let descript1 =
File1.GetSample().description.author
let descript2 =
File2.GetSample().description.author //duplicated code
在这种情况下很简单,但涉及到更长的描述和更多的 xml 文件类型。
有解决办法吗?是否可以为 XML 文件的子集创建类型提供程序,并只提取这些部分,以便代码更易于重用?
最佳答案
XML 类型提供程序在您的输入相当规律的情况下效果最好。因此,如果您需要处理多个不同的模式,最好使用标准 XML 工具(例如 XDocument
)。
也就是说,您可以使用一些技巧来让您的场景变得更好。首先,您可以指定样本的列表。为此,只需创建一个 XML 文件,其中包含一些(任何)根和您的两个示例:
<?xml version="1.0" encoding="utf-8"?>
<samples>
<root>
<description><author> Me </author></description>
<element > Data </element>
<otherelement> Data </otherelement>
</root>
<root2>
<description ><author> Me </author></description>
<elem > Data </elem>
<diffelem> Data </diffelem >
</root2>
</samples>
现在您可以创建 XML 类型提供程序并告诉它您的示例文件是一个列表 (SampleIsList=true
) 并且它应该使用全局解析(这意味着所有名为 description
的元素将被视为相同类型的值):
type X = XmlProvider<"C:/temp/sample1.xml", SampleIsList=true, Global=true>
现在,您有不同的命名根,这使情况变得更加棘手,但您现在可以编写代码来获取 <description>
来自一个或另一个根的元素:
let i = X.Load("...")
let description =
match i.Root, i.Root2 with
| Some r1, _ -> r1.Description
| _, Some r2 -> r2.Description
| _ -> failwith "Missing"
这为您提供了一个带有 author
的描述节点您可以获得两个文档的子节点:
description.Author
关于xml - F# XML 类型提供程序公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524247/