No to pokolei, do sprawdzenia jpk_vat potrzebujemy 5 plikow xsd:
Dla przestrzeni nazw: http://jpk.mf.gov.pl/wzor/2017/11/13/1113/:
:
- Schemat_JPK_VAT(3)_v1-1.xsd
Dla przestrzeni nazw http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/
:
2. StrukturyDanych_v4-0E.xsd
3. ElementarneTypyDanych_v4-0E.xsd
4. KodyUrzedowSkarbowych_v4-0E.xsd
5. KodyKrajow_v4-1E.xsd
i teraz tak:
- plik
Schemat_JPK_VAT(3)_v1-1.xsd
importuje StrukturyDanych_v4-0E.xsd
- Plik
StrukturyDanych_v4-0E.xsd
dołącza (include) ElementarneTypyDanych_v4-0E.xsd
- Plik
ElementarneTypyDanych_v4-0E.xsd
includuje KodyUrzedowSkarbowych_v4-0E.xsd
i KodyKrajow_v4-1E.xsd
Czyli dodając Schemat_JPK_VAT(3)_v1-1.xsd
w kolekcji schemaset pojawią się wszystkie pliki i każde kolejne dodanie spowoduje błąd z duplikacją nazw.
Czyli najproście napisać własnego XmlResolver
który zamiast pobierać z netu pobierze lokalnie z dysku.
Załóżmy, że wszystko masz w katalogu c:\roboczy\xml\
I chcesz sprawdzić takiego błednego xml-a:
<?xml version="1.0" encoding="UTF-8"?>
<JPK xmlns="http://jpk.mf.gov.pl/wzor/2017/11/13/1113/" xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/">
<Naglowek>
<KodFormularza kodSystemowy="JPK_VAT (3)" wersjaSchemy="1-0">JPK_VAT</KodFormularza>
<WariantFormularza>3</WariantFormularza>
<CelZlozenia>1</CelZlozenia>
<DataWytworzeniaJPK>2019-06-14T12:25:07</DataWytworzeniaJPK>
<DataOd>2019-06-01</DataOd>
<DataDo>2019-06-30</DataDo>
<NazwaSystemu>program</NazwaSystemu>
</Naglowek>
<Podmiot1>
<NIP>błędny nip</NIP>
<PelnaNazwa>Pełna nazwa firmy</PelnaNazwa>
</Podmiot1>
</JPK>
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Schema;
using System.IO;
namespace ConsoleApp1
{
class Program
{
internal class XUrlResolver : XmlUrlResolver
{
public override Uri ResolveUri(Uri baseUri, string relativeUri)
{
return base.ResolveUri(baseUri, relativeUri);
}
public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
{
if (absoluteUri.Scheme == "http")
{
string xsd = absoluteUri.Segments.Last();
Console.WriteLine(xsd);
return new MemoryStream(File.ReadAllBytes(@"C:\Roboczy\xml\" + xsd));
}
return base.GetEntity(absoluteUri, role, ofObjectToReturn);
}
}
static void Main(string[] args)
{
XmlReaderSettings xmlSettings = new XmlReaderSettings();
xmlSettings.ValidationType = ValidationType.Schema;
xmlSettings.Schemas.XmlResolver = new XUrlResolver();
xmlSettings.Schemas.Add(null, @"C:\Roboczy\xml\Schemat_JPK_VAT(3)_v1-1.xsd");
xmlSettings.Schemas.Compile();
xmlSettings.ValidationEventHandler += new ValidationEventHandler(xmlSettingsValidationEventHandler);
var streamXML = new FileStream(@"c:\roboczy\xml\jpk_vat.xml", FileMode.Open);
XmlReader xmlJPK = XmlReader.Create(streamXML, xmlSettings);
while (xmlJPK.Read()) ;
Console.Write("Koniec");
}
static void xmlSettingsValidationEventHandler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Warning)
{
Console.Write("WARNING: ");
Console.WriteLine(e.Message);
}
else if (e.Severity == XmlSeverityType.Error)
{
Console.Write("ERROR: ");
Console.WriteLine(e.Message);
}
}
}
}
Nie jest to jakoś specjalnie dopracowane, ale pokazuje ci tylko droge do celu...
wynik
StrukturyDanych_v4-0E.xsd
ElementarneTypyDanych_v4-0E.xsd
KodyUrzedowSkarbowych_v4-0E.xsd
KodyKrajow_v4-1E.xsd
ERROR: Wartość atrybutu 'wersjaSchemy' nie jest równa jego ustalonej wartości.
ERROR: Element 'http://jpk.mf.gov.pl/wzor/2017/11/13/1113/:NIP' jest nieprawidłowy. Wartość 'błędny nip' jest nieprawidłowa przy uwzględnieniu jego typu danych 'http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/:TNrNIP' - Błąd ograniczenia elementu Pattern..
Koniec
druga ściezka to połaczenie plików xsd odpowiedzialnych za http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2016/01/25/eD/DefinicjeTypy/
w jeden plik, wyrzucenie importu z Schemat_JPK_VAT(3)_v1-1.xsd
i załadowanie tych dwóch plikow lokalnie, wtedy nic nie bedzie brane z internetu.