首页 文章

从XBRL schemaRef解析XML模式

提问于
浏览
2

我正在尝试验证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”中具有无效的子元素“SoftwarePackageName” / BD /项目/ BD-algemeen” . 预期可能元素的列表:命名空间“http://www.xbrl.org/2003/instance”中的“item,tuple,context,unit”以及命名空间“http://www.xbrl.org”中的“footnoteLink” / 2003 /链接库” .

显然,SchemaSet.Compile无法找到所有相关的XSD(直接链接到主XSD here) . 我've been trying different ways of loading the schema and parsing the document for hours now, but I'我不知道如何解决这个问题 .

我也尝试用Gepsio阅读该文档 . Gepsio加载文档,但在文档中找不到任何事实,因此看起来荷兰分类法模式的结构就是问题所在 .

1 回答

  • 0

    您的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>
    

    根据架构,不允许这样做 .

    如果您认为应该允许它们,可能您没有使用正确的架构 .

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

相关问题