xml - F# XML 类型提供程序公共(public)元素

标签 xml f# xsd type-providers f#-data

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/

相关文章:

java - 在 JAR 中组织 XSD

java - 使用 jaxb 从 xml 生成 java 类时缺少类

android - 具有颜色和背景图像的按钮

java - XML解析、动态结构、内容

android - Uses_​​permission 在 androidmanifest.xml 中被忽略

f# - 如何实现 DivideByInt

c# - 使用 xsd.exe 生成带有 SchemaImporterExtension 的 C# 类。不修改 machine.config

java - 将 JSON 对象解析为 XML

f# - 从 F# 交互式卸载/取消引用引用的程序集

list - 在 F# 中声明类型列表参数