F # перезагрузить XmlProvider - PullRequest
0 голосов
/ 06 мая 2020

У меня вопрос, я использовал Xml провайдера для загрузки встроенного контента xml, и он отлично работает. Но мне было интересно, можно ли создать Dynami c XmlProvider.

Например, у меня есть API, который загружает файл xml, поэтому я читаю содержимое этого файла и хочу создать XmlProvider на его основе контент (теперь я могу загрузить несколько типов схем xml, например, events. xml и product. xml, поэтому схемы могут быть динамическими c).

Я могу подготовить механику который будет поддерживать эти схемы, но для этого мне нужен XmlProvider, и, как я вижу, мне нужно иметь какой-то существующий шаблон в виде строки xml или пути к файлу xml, например:

type Test = XmlProvider<"<root><value>1</value><value>3</value></root>">

В моем случае я не могу этого сделать, потому что я могу загрузить несколько разных xml файлов, пока у меня есть:

type Communication = XmlProvider<"<None></None>"> 
let ReadXmlFileUsingContent (xmlFileContent : string) = Provider.Parse xmlFileContent

Но это не сработает, потому что шаблон xml разные, чем поставщики.

Итак, мой вопрос: могу ли я создать поставщика с шаблоном Dynami c или создать поставщика, когда это необходимо сейчас, при запуске программы.

1 Ответ

2 голосов
/ 07 мая 2020

Невозможно создать XmlProvider со схемой c Dynami. Вам нужно будет заглянуть в XML, чтобы решить, какой XmlProvider вы хотите использовать:

open FSharp.Data
open System.Xml.Linq


type EventProvider = XmlProvider<"<event><foo id=\"10\" /></event>">
type ProductProvider = XmlProvider<"<product><bar name=\"bar\" /></product>">


type XmlResult =
| Event of EventProvider.Event
| Product of ProductProvider.Product
| Error of string


let parse xml = 
    try
        let doc = XDocument.Parse xml

        match doc.Root.Name.LocalName.ToLower() with
        | "event" -> Event (EventProvider.Parse xml)
        | "product" -> Product (ProductProvider.Parse xml)
        | other -> Error (sprintf "Unknown document root: %s" other)
    with
    | ex -> Error ex.Message
...