Разбор XML-схемы из XBRL schemaRef

Я пытаюсь проверить документ 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);
});

Это приводит к следующему сообщению об ошибке:

проверка документа не удалась: элемент «xbrl» в пространстве имен «http://www.xbrl.org/2003/instance» имеет недопустимый дочерний элемент «SoftwarePackageName» в пространстве имен «http://www.nltaxonomie.nl/8.0/basis/bd/items/bd-algemeen'. Ожидается список возможных элементов: 'item, tuple, context, unit' в пространстве имен 'http://www.xbrl.org/2003/instance», а также «footnoteLink» в пространстве имен «http://www.xbrl.org/2003/linkbase».

По-видимому, SchemaSet.Compile не может найти все связанные XSD (прямая ссылка на основной XSD здесь). Я пробовал разные способы загрузки схемы и анализа документа в течение нескольких часов, но я не уверен, как решить эту проблему.

Я также пытался прочитать документ с помощью Gepsio. Gepsio загружает документ, но не находит в нем никаких фактов, так что, похоже, проблема здесь в структуре схемы голландской таксономии.


person Hanno    schedule 05.06.2014    source источник
comment
Я автор Гепсио. Я загружу этот экземпляр документа с помощью Gepsio и выполню отладку, чтобы выяснить, почему не возвращаются факты. Возможно, отладка даст вам некоторое представление. Не стесняйтесь обращаться к проекту Gepsio по электронной почте [email protected] с дополнительной информацией.   -  person JeffFerguson    schedule 13.06.2014
comment
Привет @JeffFerguson, я уже это исправил :) Я взял твой исходный код и изменил его для работы с голландской таксономией. Мне нужно было сделать следующее: 1. В конструкторе класса XbrlSchema вызвать LookForAnnotations() сразу после ReadSchemaNode(). 2. Переберите все локаторы в DefinitionLinks, чтобы найти больше XSD. 3. После этого мне все еще не хватало схем, они находятся в презентационных ссылках, поэтому я добавил для этого новые классы. Это дало мне список схем для добавления в набор. 4. Голландская таксономия использует «спецификацию» и «презентацию», я их тоже добавил.   -  person Hanno    schedule 15.06.2014
comment
Привет @Hanno ... это отличная новость!   -  person JeffFerguson    schedule 16.06.2014
comment
Где я могу получить копию голландской таксономии и пример экземпляра? Я хотел бы убедиться, что официальная версия Gepsio поддерживает это. Не стесняйтесь присылать образцы по электронной почте [email protected] ... большое спасибо!   -  person JeffFerguson    schedule 16.06.2014
comment
Привет, ребята, у меня такая же проблема, но с таксономией nl 9.0 проблема та же. можете вы помочь мне?   -  person Fábio Correia    schedule 19.01.2016


Ответы (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>

по схеме не допускаются.

Если вы считаете, что они должны быть разрешены, вероятно, вы используете неправильную схему.

Если ваше приложение может использовать производный тип, решением будет создание новой схемы, которая импортирует нужную вам схему и определяет новый корень (в новом пространстве имен), который позволяет использовать дополнительные элементы. Если типы в исходной схеме открыты, вы также можете попытаться переопределить корневой тип в том же пространстве имен.

person helderdarocha    schedule 05.06.2014
comment
Дело в том, что эти элементы определены в других XSD. Глядя на основной XSD, он содержит ссылки на другие файлы определений, например. ' ‹link:linkbaseRef xlink:href=../linkroles/bd-voorblad-pre.xml xlink:role=xbrl.org/2003/role/presentationLinkbaseRef xlink:arcrole=w3.org/1999/xlink/properties/linkbase xlink:type=simple/›' , этот файл содержит локаторы ссылок на фактические элементы. См., например, этот файл. Вместе с другими ссылками в основном XSD он образует полную таксономию. - person Hanno; 06.06.2014
comment
да. Сами элементы не являются недействительными. Они неуместны, так как элемент <xbrli:xbrl> не допускает их в качестве дочерних (его XSD не поддерживает включение произвольных элементов из других пространств имен — только элементы, которые там объявлены). Вы можете иметь оба в одном документе, если поместите их как дочерние элементы другого корневого узла и создадите схему для проверки этого. Это вариант? - person helderdarocha; 06.06.2014