xml - 使用 F# XMLProvider 解析带有命名空间的 XML
问题描述
我一直在尝试使用 XMLProvider 解析 XML NLog 消息。在我的项目中,我通过以下方式定义了提供者:
XmlProvider<"""
<log4j:event
logger="MyTest" level="INFO" timestamp="1597329370954" thread="1">
<log4j:message>
Running task
</log4j:message>
<log4j:locationInfo class="My.Task" method="Void main(System.String[])" />
<nlog:eventSequenceNumber>
11
</nlog:eventSequenceNumber>
<nlog:locationInfo assembly="My.Task, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<nlog:properties />
<log4j:properties>
<data name="log4japp" value="My.Task(64400)" />
<data name="log4jmachinename" value="BNT" />
</log4j:properties>
</log4j:event>""">
但这不会编译,因为我收到有关缺少命名空间定义的异常。所以我将 xmlns 添加到根元素中,使其成为:
XmlProvider<"""
<log4j:event
xmlns:log4j="http://jakarta.apache.org/log4j/"
xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd"
logger="MyTest" level="INFO" timestamp="1597329370954" thread="1">
<log4j:message>
...
...
</log4j:event>""">
它有助于我的项目编译,但在尝试解析 XML 时会在运行时引发异常:
'log4j' is an undeclared prefix. Line 1, position 2.
我通过预处理 xml 并从所有标签中删除所有 xml 命名空间来解决这个问题。虽然这可行,但我想知道是否有更好的解决方案。
解决方案
这对我来说很好,但是您需要在示例 XML 和实际数据中都包含 XML 命名空间声明。例如,以下工作正常:
// Simplified declaration with namespaces included
type X = XmlProvider<"""
<log4j:event xmlns:log4j="http://jakarta.apache.org/log4j/"
xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd">
<log4j:message>Running task</log4j:message>
<nlog:eventSequenceNumber>11</nlog:eventSequenceNumber>
</log4j:event>""">
// Load a sample data file with namespaces included
let x = X.Parse("""
<log4j:event xmlns:log4j="http://jakarta.apache.org/log4j/"
xmlns:nlog="http://www.nlog-project.org/schemas/NLog.xsd">
<log4j:message>Running task</log4j:message>
<nlog:eventSequenceNumber>11</nlog:eventSequenceNumber>
</log4j:event>""")
// Returns the data from the XML just fine!
x.Message
x.EventSequenceNumber
如果您从数据中省略 XML 命名空间声明,则会失败:
let y = X.Parse("""
<log4j:event>
<log4j:message>Running task</log4j:message>
<nlog:eventSequenceNumber>11</nlog:eventSequenceNumber>
</log4j:event>""")
我认为没有办法告诉 XML 类型提供程序隐式包含命名空间声明 - 我可以看到这将是一个有用的功能,所以请随时在项目 GitHub 上提出建议!
推荐阅读
- c - 何时使用静态数组与动态数组 C
- java - 如何从 java 应用程序连接到 PCF 并列出组织、空间、应用程序及其配置?
- javascript - 用 Javascript 的 .split( ) 模拟 PHP 的 explode( )
- ios - 我寻找可以告诉阅读pdf百分比的方法或框架
- c# - 创建嵌套 Dto 以返回复合键存在于数组中的数据
- python - 从父类继承单元测试
- r - 如何存储不同类型(数字和字符)的多个结果?
- c++ - 将 invoke_result 与 void 参数类型一起使用?
- c - 函数原型和块代码中的变量声明:区别?
- .net - 更新 IMemoryCache 服务器端