我生成的XDocument
需要验证Xbrl xsd's
我创建了一个自定义XmlResolver
来加载外部方的所有xsd
文件。
这是我的解析器中的GetEntity
函数,因此我可以获得包含的xsd's
:
Public Overrides Function GetEntity(absoluteUri As Uri, role As String, ofObjectToReturn As Type) As Object
'If absoluteUri.ToString.Contains("www.xbrl.org") Then
' Nothing here yet
'End If
Dim nmSpace As String = _assembly.GetName.Name.ToString
Dim resource = String.Concat(nmSpace, ".", Path.GetFileName(absoluteUri.ToString()))
Dim result = _assembly.GetManifestResourceStream(resource)
Return result
End Function
然而,xbrl命名空间中有很多xsd,并且它们没有被加载。
我开始下载它们以将它们作为资源包含在内但是只有很多文件因此它似乎不是最好的解决方案。
我希望任何人都有一些验证Xbrl文件的经验,因为我觉得我在这里忽略了这一点:)
答案 0 :(得分:2)
www.Arelle.org
此开源项目包含一个可用于验证Xbrl文件的Web服务。 这就是我现在实现的,它检查所有必需的Xbrl规则
答案 1 :(得分:1)
我正在使用普通的Xml-Xsd验证,到目前为止这似乎没问题。
我实现了这样的自定义解析器:
Public Class ResourceXmlResolver
Inherits XmlResolver
Private Shared _xmlUrlResolver As XmlUrlResolver = New XmlUrlResolver()
Private _assembly As Assembly
Public Sub New(assembly As Assembly)
_assembly = assembly
End Sub
Public Overrides Function GetEntity(absoluteUri As Uri, role As String, ofObjectToReturn As Type) As Object
If absoluteUri.ToString.Contains("www.xbrl.org") Then
Return _xmlUrlResolver.GetEntity(absoluteUri, role, ofObjectToReturn)
End If
Dim nmSpace As String = _assembly.GetName.Name.ToString
Dim resource = String.Concat(nmSpace, ".", Path.GetFileName(absoluteUri.ToString()))
Dim result = _assembly.GetManifestResourceStream(resource)
Return result
End Function
Public Overrides WriteOnly Property Credentials() As System.Net.ICredentials
Set(value As System.Net.ICredentials)
Throw New NotImplementedException()
End Set
End Property
结束班
第三方提供的Xsd文件是嵌入式资源。
我将程序集设置为包含我的Xsd文件的程序集,因此当通过设置解析程序调用GetEntity方法时:
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.XmlResolver = New ResourceXmlResolver(System.Reflection.Assembly.GetExecutingAssembly)
它们已正确加载。但我会从www.xbrl.org上检查xsd 在那种情况下,我使用标准的XmlUrlResolver从网络上获取它们。
我也通过下载所有xbrl xsd并嵌入它们来实现这一点。
我希望这对Xbrl来说是足够的验证,但到目前为止还是有效:)