【问题标题】:XML schema parsing from XBRL schemaRef从 XBRL schemaRef 解析 XML 模式
【发布时间】:2014-06-05 13:26:12
【问题描述】:

我正在尝试验证 XBRL 文档,但我有点迷茫。 XBRL 是荷兰公司税提交分类法的(简化)示例。这是 XBRL:

string xbrl = @"<xbrli:xbrl xml:lang='nl' xmlns:xbrli='http://www.xbrl.org/2003/instance' xmlns:link='http://www.xbrl.org/2003/linkbase' xmlns:xlink='http://www.w3.org/1999/xlink' xmlns:bd-alg='http://www.nltaxonomie.nl/8.0/basis/bd/items/bd-algemeen' xmlns:xbrldi='http://xbrl.org/2006/xbrldi' xmlns:bd-dim-dom='http://www.nltaxonomie.nl/8.0/basis/bd/domains/bd-domains' xmlns:bd-dim-dim='http://www.nltaxonomie.nl/8.0/domein/bd/axes/bd-axes' xmlns:bd-bedr='http://www.nltaxonomie.nl/8.0/basis/bd/items/bd-bedrijven' xmlns:iso4217='http://www.xbrl.org/2003/iso4217'>
<link:schemaRef xlink:type='simple' xlink:href='http://www.nltaxonomie.nl/8.0/report/bd/entrypoints/bd-rpt-vpb-aangifte-2013.xsd' xlink:arcrole='http://www.w3.org/1999/xlink/properties/linkbase'/>
<xbrli:context id='c1'>
    <xbrli:entity>
        <xbrli:identifier scheme='www.belastingdienst.nl/identificatie'>800030357</xbrli:identifier>
    </xbrli:entity>
    <xbrli:period>
        <xbrli:startDate>2013-07-01</xbrli:startDate>
        <xbrli:endDate>2014-06-01</xbrli:endDate>
    </xbrli:period>
    <xbrli:scenario>
        <xbrldi:explicitMember dimension='bd-dim-dim:PartyDimension'>bd-dim-dom:Declarant</xbrldi:explicitMember>
    </xbrli:scenario>
</xbrli:context>
<xbrli:context id='c2'>
    <xbrli:entity>
        <xbrli:identifier scheme='www.belastingdienst.nl/identificatie'>800030357</xbrli:identifier>
    </xbrli:entity>
    <xbrli:period>
        <xbrli:instant>2014-06-01</xbrli:instant>
    </xbrli:period>
    <xbrli:scenario>
        <xbrldi:explicitMember dimension='bd-dim-dim:TimeDimension'>bd-dim-dom:End</xbrldi:explicitMember>
        <xbrldi:explicitMember dimension='bd-dim-dim:PartyDimension'>bd-dim-dom:Declarant</xbrldi:explicitMember>
    </xbrli:scenario>
</xbrli:context>
<xbrli:unit id='u1'>
    <xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
<bd-alg:SoftwarePackageName contextRef='c1'>SoftwareNaame</bd-alg:SoftwarePackageName>
<bd-alg:SoftwarePackageVersion contextRef='c1'>V1</bd-alg:SoftwarePackageVersion>
<bd-alg:TaxReturnMessageType contextRef='c1'>81</bd-alg:TaxReturnMessageType>
<bd-bedr:AssetsTotalAmountFiscal contextRef='c2' decimals='INF' unitRef='u1'>0</bd-bedr:AssetsTotalAmountFiscal>
<bd-bedr:BalanceProfitCalculationForTaxPurposesFiscal contextRef='c1' decimals='INF' unitRef='u1'>0</bd-bedr:BalanceProfitCalculationForTaxPurposesFiscal>
</xbrli:xbrl>";

我使用以下代码加载 XSD 并验证文档:

var doc = XDocument.Parse(xbrl);
var xmlReader =  XmlReader.Create("http://www.nltaxonomie.nl/8.0/report/bd/entrypoints/bd-rpt-vpb-aangifte-2013.xsd");
var schema = XmlSchema.Read(xmlReader,
(sender, e) => { throw e.Exception; });

var set = new XmlSchemaSet();
set.Add(schema);
set.Compile();

doc.Validate(set, (sender, e) =>
{
    throw new Exception("document validation failed: " + e.Message);
});

这会产生以下错误消息:

文档验证失败:命名空间“http://www.xbrl.org/2003/instance”中的元素“xbrl”在命名空间“http://www.nltaxonomie.nl/8.0/basis/bd/items/bd-algemeen”中具有无效的子元素“SoftwarePackageName”。预期的可能元素列表:命名空间“http://www.xbrl.org/2003/instance”中的“项目、元组、上下文、单元”以及命名空间“http://www.xbrl.org/2003/linkbase”中的“footnoteLink”。

显然 SchemaSet.Compile 无法找到所有相关的 XSD(直接链接到主 XSD here)。几个小时以来,我一直在尝试不同的方式来加载架构和解析文档,但我不确定如何解决这个问题。

我也尝试使用Gepsio 阅读文档。 Gepsio 加载了文档,但没有在文档中找到任何事实,所以看起来荷兰分类模式的结构是这里的问题。

【问题讨论】:

  • 我是 Gepsio 的作者。我将使用 Gepsio 加载此文档实例并进行一些调试以找出为什么没有返回任何事实。也许调试会给你一些洞察力。请随时通过 Gepsio@outlook.com 向 Gepsio 项目发送电子邮件,了解更多信息。
  • 嗨@JeffFerguson,我已经修复了它 :) 我获取了你的源代码并对其进行了修改以适用于荷兰分类法。我需要做的是: 1. 在 XbrlSchema 类构造函数中,在 ReadSchemaNode() 之后立即调用 LookForAnnotations()。 2. 遍历DefinitionLinks 中的所有定位器以查找更多XSD。 3. 在那之后我仍然缺少模式,它们可以在presentationLinks 中找到,所以我为此添加了新类。这给了我一个要添加到集合中的模式列表。 4. 荷兰分类法使用“specificationTuple”和“presentationTuple”,我也添加了这些。
  • 嗨@Hanno ...这是个好消息!
  • 在哪里可以获得荷兰分类法的副本和示例实例?我想确保 Gepsio 官方版本支持它。随时通过电子邮件将样品发送至 gepsio@outlook.com ...非常感谢!
  • 大家好,我遇到了同样的问题,但是使用分类法 nl 9.0,问题是一样的。你能帮帮我吗?

标签: c# xsd xbrl


【解决方案1】:

您的 XML 实例未使用该架构进行验证。也许它会使用另一个导入它的架构进行验证,或者您可能需要创建一个新架构来导入您需要的所有架构。

问题在于,这些元素位于文件末尾的根目录之下的顶层:

<bd-alg:SoftwarePackageName contextRef='c1'>SoftwareNaame</bd-alg:SoftwarePackageName>
<bd-alg:SoftwarePackageVersion contextRef='c1'>V1</bd-alg:SoftwarePackageVersion>
<bd-alg:TaxReturnMessageType contextRef='c1'>81</bd-alg:TaxReturnMessageType>
<bd-bedr:AssetsTotalAmountFiscal contextRef='c2' decimals='INF' unitRef='u1'>0</bd-bedr:AssetsTotalAmountFiscal>
<bd-bedr:BalanceProfitCalculationForTaxPurposesFiscal contextRef='c1' decimals='INF' unitRef='u1'>0</bd-bedr:BalanceProfitCalculationForTaxPurposesFiscal>

根据架构是不允许的。

如果您认为应该允许它们,则可能您使用的架构不正确。

如果您的应用程序可以使用派生类型,一个解决方案是创建一个新模式,该模式导入您需要的模式,并定义一个新的根(在一个新的命名空间中),它允许额外的元素。如果原始模式中的类型被暴露,您还可以尝试重新定义同一命名空间中的根类型。

【讨论】:

  • 问题是这些元素是在其他 XSD 中定义的。查看主 XSD,它包含指向其他定义文件的链接,例如' xbrl.org/2003/role/presentationLinkbaseRef" xlink:arcrole="w3.org/1999/xlink/properties/linkbase" xlink:type="simple"/> ' ,该文件包含指向实际元素的链接定位器。参见例如this file。它与主要 XSD 中的其他链接一起构成了完整的分类。
  • 是的。元素本身不是无效的。它们放错了位置,因为 &lt;xbrli:xbrl&gt; 元素不允许它们作为子元素(它的 XSD 不支持包含来自其他命名空间的任意元素 - 仅支持在那里声明的元素)。如果将它们作为不同 root 节点的子节点放置,则可以将它们放在同一个文档中,并创建一个模式来验证它。这是一个选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多