2011-03-01 32 views
2

我正在嘗試使用NSXMLDocument針對模式架構(http://www.w3.org/2001/XMLSchema)驗證XML模式文檔。我已經使它正常工作,並假定我正在驗證本地模式。NSXMLDocument validateAndReturnError需要網絡連接?

但是,我發現沒有網絡連接,此驗證不起作用。有沒有辦法強制NSXMLDocument使用本地模式進行驗證?

我都用網連接工作代碼:

xmlDoc = [[NSXMLDocument alloc] initWithContentsOfURL:furl   options:(NSXMLDocumentValidate | NSXMLNodePreserveAll) 
                error:&err]; 
NSXMLElement *rootElement = [xmlDoc rootElement]; 
NSMutableArray *namespaces = [[rootElement namespaces] mutableCopy]; 
[namespaces addObject:[NSXMLNode namespaceWithName:@"xsi" stringValue:@"http://www.w3.org/2001/XMLSchema-instance"]]; 
[rootElement setNamespaces:namespaces]; 
[rootElement removeAttributeForName:@"xsi:schemaLocation"]; 
[rootElement addAttribute:[NSXMLNode attributeWithName:@"xsi:schemaLocation" stringValue:[NSString stringWithFormat:@"http://www.w3.org/2001/XMLSchema %@", @"/System/Library/Schemas/XMLSchema.xsd"]]]; 
BOOL vaildXML = [xmlDoc validateAndReturnError:&err]; 

我驗證文檔的架構標籤:

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
xmlns:myCompany="http://schema.myCompany.com/SomeSchema" 
targetNamespace="http://schema.myCompany.com/SomeSchema"> 

它似乎有與W3的一個問題。組織架構位置,但不是我公司的。

我看到

錯誤的錯誤:沒有這樣的文件或目錄 I/O警告:未能加載外部實體 「http://www.w3.org/2001/xml.xsd」

錯誤域= NSXMLParserErrorDomain代碼= 1 UserInfo = 0x103051c10「元素」{http://www.w3.org/2001/XMLSchema}import':無法在位置'http://www.w3。 org/2001/xml.xsd'跳過導入 屬性使用(未知),屬性'ref':QName值'{http://www.w3.org/XML/1998/namespace}lang'解析爲(n)屬性聲明 屬性使用(未知),屬性'ref':Th e QName值'{http://www.w3.org/XML/1998/namespace}lang'不解析爲(n)屬性聲明。

任何想法?

回答

1

查看NSXMLDTD類的Apple文檔表明您可以訪問目錄。但是,似乎對定義要使用的目錄的支持非常有限。您可以創建一個目錄/etc/xml/catalog或設置XML_CATALOG_FILES環境變量。

一旦你有一個目錄,你應該能夠爲W3模式添加一個條目以及一個本地副本。例如:

<?xml version="1.0"?> 
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD Entity Resolution XML Catalog V1.0//EN" 
    "http://www.oasis-open.org/committees/entity/release/1.0/catalog.dtd"> 
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog"> 
    <system systemId="http://www.w3.org/2001/xml.xsd" uri="xml.xsd"/> 
    <uri name="http://www.w3.org/XML/1998/namespace" uri="xml.xsd"/> 
</catalog> 

這假定您的目錄和架構在同一目錄中。

我不能嘗試這個我自己(缺乏時間和生鏽的可可技能),但它應該工作。如果我沒有記錯,NSXML基於libxml2,它肯定支持目錄。 目錄規格本身可在OASIS website找到。