Soap xml 响应通过 xsd 文件验证
Soap xml response validate with xsd file
使用https://www.freeformatter.com/xml-validator-xsd.html
如果我在响应和模式中将 soapenf 完全排除在外,它工作正常,但我想同时执行这两个操作。
(仅供参考,我想指出此 wsdl 并且 xsd 未在端点上公开,CISCO 提供 wsdl 的 zip 文件 xsd 文件)然后您可以将请求发送到根据 wsdl/xsd 服务器,它会工作。但是 wsdl 和 xsd 在 cisco.com 或安装了该服务的虚拟机或域上不可用)
如果我指向文件,这在 c# 中工作得很好,但我想将 xml 文档加载到 NSXMLDocument 变量文档中,让它指向它自己的 schemaFile,然后调用 validate
我有以下香皂xml
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"><return><componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
</soapenv:Envelope>
我从 cisco 提供的 xsd 文件中提取了最低限度的内容,在线工具与
一起使用
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:axlapi="http://www.cisco.com/AXL/API/10.5"
attributeFormDefault="unqualified" elementFormDefault="unqualified"
targetNamespace="http://www.cisco.com/AXL/API/10.5" version="10.5">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
<xsd:complexType name="GetCCMVersionRes">
<xsd:complexContent>
<xsd:extension base="axlapi:APIResponse">
<xsd:sequence>
<xsd:element name="return">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="componentVersion">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="version" type="axlapi:String50"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="getCCMVersionResponse" type="axlapi:GetCCMVersionRes"/>
<xsd:simpleType name="String50">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType abstract="true" name="APIResponse">
<xsd:annotation>
<xsd:documentation>All responses must extend abstractResponse.</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="sequence" type="xsd:unsignedLong" use="optional"/>
</xsd:complexType>
</xsd:schema>
请注意,我必须将以下内容添加到 xsd 文件中,以使其通过 SOAP 错误
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
并且在在线工具中有效
这对于在线工具来说太棒了,但我想验证文档本身。这是通过添加到 Soap 请求信封元素 "noNamespaceSchemaLocation" 或 "schemaLocation" 和指向 xsd 文件(或我创建的部分文件)的 http 路径来完成的(如果您阅读了在线工具)以上)
我试过各种方法使用在线工具,但始终无法验证。它目前托管在 http://test123a.epizy.com/getCCMVersion.xsd(我希望它不是因为我有问题的免费主机),但也应该有使用 file:///
来完成此操作的方法
我正在使用 macOS,objective-c,但所有代码都在操作 soap xml 响应 header,并放置文件的位置:/// .我也试过http://。
谁能解开这个绝对的谜团?从网上的一些例子来看,似乎是那么简单明了....
Validate XML Schema with xsd file in Cocoa?
http://answerqueen.com/2j/q7vz0zv32j
How to fix soapenv:Envelope issue in XSD schema while validating with SOAP request/response
https://code.i-harness.com/en/q/8bfd7
How to reference a local XML Schema file correctly?
提前感谢您的帮助
这家伙从来没有得到答案SOAP Response Schema Validation
原来你只能验证其中之一。您无法在一次调用中加载 soap 响应并验证 soap 以及其中的 xml。您可以将 soap 和 xml 分开并分别验证。
这是正确的代码
<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
您不能同时验证 SOAP 和里面的 XML。您必须使用 xpath 才能到达 xml 并进行验证,因为验证 soap 并不那么重要。
有趣的是 xml
我无法使用 xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
如 xml xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd"> 已作为模式命名空间引用
所以必须使用上面的替代方法。
此外,根据 xml 响应 xmlns:ns="http://www.cisco.com/AXL/API/10.5",我必须编辑架构文件以解决一些命名空间问题,ns 是命名空间,
但是在模式文件中,它被引用为 axlapi ,所有引用都更改为 ns
希望这对以后的人有所帮助。仅供参考,指向整个 AXLSoap.xsd 文件进行验证需要几分钟时间,不得不放弃
原来你只能验证其中之一。您无法在一次调用中加载 soap 响应并验证 soap 以及其中的 xml。您可以将 soap 和 xml 分开并分别验证。
这是正确的代码
<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
您不能同时验证 SOAP 和里面的 XML。您必须使用 xpath 才能到达 xml 并进行验证,因为验证 soap 并不那么重要。
有趣的是 xml
我无法使用 xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
如 xml xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd"> 已作为模式命名空间引用
所以必须使用上面的替代方法。
此外,根据 xml 响应 xmlns:ns="http://www.cisco.com/AXL/API/10.5",我必须编辑架构文件以解决一些命名空间问题,ns 是命名空间,
但是在模式文件中,它被引用为 axlapi ,所有引用都更改为 ns
希望这对以后的人有所帮助。仅供参考,指向整个 AXLSoap.xsd 文件进行验证需要几分钟时间,不得不放弃
最终的 objective-c NSXMLDocument 函数,用于处理验证 soap 或 xml 在这里。
BOOL validateDocumentUsingXMLSchemaAtPath( NSXMLDocument *doc,
NSString* xsdPath, NSString *schemaNameSpace )
{
BOOL validationResult = NO; // Default to failing validation.
// Get the root of the document.
NSXMLElement *rootElement = [doc rootElement];
// Add the XMLSchema-instance namespace, if it doesn't already exist
NSXMLNode *namespace = [NSXMLNode namespaceWithName:@"xsi"
stringValue:@"http://www.w3.org/2001/XMLSchema-instance"];
[rootElement addNamespace:namespace];
// Add the No Namespace Schema Location attribute referencing the local XSD file, and associate the XML Schema for validation.
NSURL *xsdURL = [NSURL fileURLWithPath:xsdPath];
NSString *schemaLocation = nil;
if ( namespace == nil )
{
schemaLocation = @"noNamespaceSchemaLocation";
schemaNameSpace = @"";
}
else
{
schemaLocation = @"schemaLocation";
}
NSString *schemaSpace = [NSString stringWithFormat:@"%@%@%@", schemaNameSpace, ([schemaNameSpace length] > 0) ? @" " : @"", [xsdURL description]];
NSXMLNode *schemaAttribute = [NSXMLNode attributeWithName:[NSString stringWithFormat:@"xsi:%@", schemaLocation]
stringValue:schemaSpace];
[rootElement addAttribute:schemaAttribute];
// Validate the document
NSError *error = nil;
validationResult = [doc validateAndReturnError:&error];
if ( !validationResult )
NSLog( @" %@", [error localizedDescription] );
return validationResult;
}
//usage
//find your soap, or xml document and put it in xmlDoc
BOOL ret = validateDocumentUsingXMLSchemaAtPath(xmlDoc,xsdURL, @"http://www.cisco.com/AXL/API/10.5");
使用https://www.freeformatter.com/xml-validator-xsd.html
如果我在响应和模式中将 soapenf 完全排除在外,它工作正常,但我想同时执行这两个操作。
(仅供参考,我想指出此 wsdl 并且 xsd 未在端点上公开,CISCO 提供 wsdl 的 zip 文件 xsd 文件)然后您可以将请求发送到根据 wsdl/xsd 服务器,它会工作。但是 wsdl 和 xsd 在 cisco.com 或安装了该服务的虚拟机或域上不可用)
如果我指向文件,这在 c# 中工作得很好,但我想将 xml 文档加载到 NSXMLDocument 变量文档中,让它指向它自己的 schemaFile,然后调用 validate
我有以下香皂xml
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" >
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"><return><componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
</soapenv:Envelope>
我从 cisco 提供的 xsd 文件中提取了最低限度的内容,在线工具与
一起使用<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:axlapi="http://www.cisco.com/AXL/API/10.5"
attributeFormDefault="unqualified" elementFormDefault="unqualified"
targetNamespace="http://www.cisco.com/AXL/API/10.5" version="10.5">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
<xsd:complexType name="GetCCMVersionRes">
<xsd:complexContent>
<xsd:extension base="axlapi:APIResponse">
<xsd:sequence>
<xsd:element name="return">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="componentVersion">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="version" type="axlapi:String50"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:element name="getCCMVersionResponse" type="axlapi:GetCCMVersionRes"/>
<xsd:simpleType name="String50">
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType abstract="true" name="APIResponse">
<xsd:annotation>
<xsd:documentation>All responses must extend abstractResponse.</xsd:documentation>
</xsd:annotation>
<xsd:attribute name="sequence" type="xsd:unsignedLong" use="optional"/>
</xsd:complexType>
</xsd:schema>
请注意,我必须将以下内容添加到 xsd 文件中,以使其通过 SOAP 错误
<xsd:import namespace="http://schemas.xmlsoap.org/soap/envelope/" schemaLocation="http://schemas.xmlsoap.org/soap/envelope/"/>
并且在在线工具中有效
这对于在线工具来说太棒了,但我想验证文档本身。这是通过添加到 Soap 请求信封元素 "noNamespaceSchemaLocation" 或 "schemaLocation" 和指向 xsd 文件(或我创建的部分文件)的 http 路径来完成的(如果您阅读了在线工具)以上)
我试过各种方法使用在线工具,但始终无法验证。它目前托管在 http://test123a.epizy.com/getCCMVersion.xsd(我希望它不是因为我有问题的免费主机),但也应该有使用 file:///
来完成此操作的方法我正在使用 macOS,objective-c,但所有代码都在操作 soap xml 响应 header,并放置文件的位置:/// .我也试过http://。
谁能解开这个绝对的谜团?从网上的一些例子来看,似乎是那么简单明了....
Validate XML Schema with xsd file in Cocoa?
http://answerqueen.com/2j/q7vz0zv32j
How to fix soapenv:Envelope issue in XSD schema while validating with SOAP request/response
https://code.i-harness.com/en/q/8bfd7
How to reference a local XML Schema file correctly?
提前感谢您的帮助
这家伙从来没有得到答案SOAP Response Schema Validation
原来你只能验证其中之一。您无法在一次调用中加载 soap 响应并验证 soap 以及其中的 xml。您可以将 soap 和 xml 分开并分别验证。
这是正确的代码
<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
您不能同时验证 SOAP 和里面的 XML。您必须使用 xpath 才能到达 xml 并进行验证,因为验证 soap 并不那么重要。
有趣的是 xml
我无法使用 xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
如 xml xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd"> 已作为模式命名空间引用
所以必须使用上面的替代方法。
此外,根据 xml 响应 xmlns:ns="http://www.cisco.com/AXL/API/10.5",我必须编辑架构文件以解决一些命名空间问题,ns 是命名空间,
但是在模式文件中,它被引用为 axlapi ,所有引用都更改为 ns
希望这对以后的人有所帮助。仅供参考,指向整个 AXLSoap.xsd 文件进行验证需要几分钟时间,不得不放弃
原来你只能验证其中之一。您无法在一次调用中加载 soap 响应并验证 soap 以及其中的 xml。您可以将 soap 和 xml 分开并分别验证。
这是正确的代码
<?xml version='1.0' encoding='UTF-8'?>"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns:getCCMVersionResponse xmlns:ns="http://www.cisco.com/AXL/API/10.5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
<return>
<componentVersion>
<version>10.5.2.11900(3)</version>
</componentVersion>
</return>
</ns:getCCMVersionResponse>
</soapenv:Body>
您不能同时验证 SOAP 和里面的 XML。您必须使用 xpath 才能到达 xml 并进行验证,因为验证 soap 并不那么重要。
有趣的是 xml
我无法使用 xsi:noNameSpaceSchemaLocation="file:///Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd">
如 xml xsi:schemaLocation="http://www.cisco.com/AXL/API/10.5
/Users/michael/Downloads/axlsqltoolkit/schema/current/getCCMVersion.xsd"> 已作为模式命名空间引用
所以必须使用上面的替代方法。
此外,根据 xml 响应 xmlns:ns="http://www.cisco.com/AXL/API/10.5",我必须编辑架构文件以解决一些命名空间问题,ns 是命名空间,
但是在模式文件中,它被引用为 axlapi ,所有引用都更改为 ns
希望这对以后的人有所帮助。仅供参考,指向整个 AXLSoap.xsd 文件进行验证需要几分钟时间,不得不放弃
最终的 objective-c NSXMLDocument 函数,用于处理验证 soap 或 xml 在这里。
BOOL validateDocumentUsingXMLSchemaAtPath( NSXMLDocument *doc,
NSString* xsdPath, NSString *schemaNameSpace )
{
BOOL validationResult = NO; // Default to failing validation.
// Get the root of the document.
NSXMLElement *rootElement = [doc rootElement];
// Add the XMLSchema-instance namespace, if it doesn't already exist
NSXMLNode *namespace = [NSXMLNode namespaceWithName:@"xsi"
stringValue:@"http://www.w3.org/2001/XMLSchema-instance"];
[rootElement addNamespace:namespace];
// Add the No Namespace Schema Location attribute referencing the local XSD file, and associate the XML Schema for validation.
NSURL *xsdURL = [NSURL fileURLWithPath:xsdPath];
NSString *schemaLocation = nil;
if ( namespace == nil )
{
schemaLocation = @"noNamespaceSchemaLocation";
schemaNameSpace = @"";
}
else
{
schemaLocation = @"schemaLocation";
}
NSString *schemaSpace = [NSString stringWithFormat:@"%@%@%@", schemaNameSpace, ([schemaNameSpace length] > 0) ? @" " : @"", [xsdURL description]];
NSXMLNode *schemaAttribute = [NSXMLNode attributeWithName:[NSString stringWithFormat:@"xsi:%@", schemaLocation]
stringValue:schemaSpace];
[rootElement addAttribute:schemaAttribute];
// Validate the document
NSError *error = nil;
validationResult = [doc validateAndReturnError:&error];
if ( !validationResult )
NSLog( @" %@", [error localizedDescription] );
return validationResult;
}
//usage
//find your soap, or xml document and put it in xmlDoc
BOOL ret = validateDocumentUsingXMLSchemaAtPath(xmlDoc,xsdURL, @"http://www.cisco.com/AXL/API/10.5");