我正在使用以下代码创建一个 DOMDocument 并针对外部 xsd 文件对其进行验证。
<?php
$xmlPath = "/xml/some/file.xml";
$xsdPath = "/xsd/some/schema.xsd";
$doc = new \DOMDocument();
$doc->loadXML(file_get_contents($xmlPath), LIBXML_NOBLANKS);
if (!$doc>schemaValidate($xsdPath)) {
throw new InvalidXmlFileException();
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,这意味着如果 XML 与 XSD 的定义不匹配,它将抛出一个有意义的异常。
现在,我想使用 Xpath 从 DOMDocument 中检索信息。它也可以正常工作,但是,从这一点开始,DOMDocument 与 XSD 完全分离!例如,如果我有一个DOMNode,我不知道它是simpleType类型还是complexType类型。我可以检查节点是否有子节点(hasChild()),但这不一样。此外,XSD 中还有大量信息(例如,最小和最大出现次数等)。
问题真的是,我必须自己查询 XSD 还是有一种编程方式来询问这些问题。即这个DOMNode是复杂类型还是简单类型?
在另一篇文章中,有人建议“使用真正的模式处理器处理模式,然后使用其 API 询问有关模式内容的问题”。XPath 是否有一个 API 来检索 XSD 的信息,或者是否有与 DOMDocument 不同的便捷方式?
现在,我想继续使用 XPath 解析 DOMDocument 中的信息。为了提高我存储到数据库中的数据的完整性并向客户端提供有意义的错误消息,我想不断使用模式信息来验证查询。即我想根据 xsd 中定义的允许的子节点验证获取的 childNodes。我想通过在 xsd 文档上使用 XPath 来做到这一点。
但是,我偶然发现了 …
我需要验证以编程方式生成的XML Schema Instance(XSD)文档,以便我使用以下Java代码段,它可以正常工作:
SchemaFactory factory = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema xsdSchema = factory.newSchema( // Reads URL every time...
new URL("http://www.w3.org/2001/XMLSchema.xsd"));
Validator xsdValidator = xsdSchema.newValidator();
xsdValidator.validate(new StreamSource(schemaInstanceStream));
Run Code Online (Sandbox Code Playgroud)
但是,当我在本地保存XML Schema定义文件并以这种方式引用它时:
Schema schema = factory.newSchema(
new File("test/xsd/XMLSchema.xsd"));
Run Code Online (Sandbox Code Playgroud)
它失败,出现以下异常:
org.xml.sax.SAXParseException:schema_reference.4:无法读取架构文档'file:/Users/foo/bar/test/xsd/XMLSchema.xsd',因为1)找不到该文档; 2)文件无法阅读; 3)文档的根元素不是<xsd:schema>.
我确保文件存在,并且可以通过对对象执行exists()和canRead()断言来读取File.我还使用几个不同的实用程序(Web浏览器,wget)下载了该文件,以确保没有损坏.
当我从HTTP URL生成模式时,我知道为什么我可以验证XSD实例文档,但是当我尝试从具有相同内容的本地文件生成时,我得到了上述异常?
[编辑]
为了详细说明,我尝试了多种形式的factory.newSchema(...)使用Readers和InputStreams(而不是直接使用File)并且仍然得到完全相同的错误.此外,我在使用它或各种输入流之前已经转储了文件内容以确保它是正确的.相当令人烦恼.
事实证明,XML Schema引用了另外三个文件,它们也必须存储在本地,并XMLSchema.xsd包含一个schemaLocation必须更改其属性的import语句.以下是必须保存在同一目录中的文件:
schemaLocation为" xml.xsd".感谢@Blaise Doughan和@Tomasz Nurkiewicz的提示.
在自动格式化后,我在验证XML文件时遇到问题.在验证字符串之前,验证不会修剪字符串.这是.NET的XML验证实现中的错误还是这种可接受的行为?如果它是被接受的行为,那么通常如何处理这样的情况,因为在我看来,这两个XML文件是等价的.
我的XSD:
<xs:schema ...>
...
<xs:simpleType name="ItemTypeData">
<xs:restriction base="xs:string">
<xs:enumeration value="ItemA" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
格式化之前的我的XML(验证通过):
...
<ItemType>ItemA</ItemType>
...
Run Code Online (Sandbox Code Playgroud)
格式化后(验证失败):
...
<ItemType>
ItemA
</ItemType>
...
Run Code Online (Sandbox Code Playgroud) 我正在根据模式验证XML文档.尝试使用此代码验证它们时,一些更复杂的文档/模式总是会失败:
DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
dbfac.setNamespaceAware(true);
dbfac.setIgnoringElementContentWhitespace(true);
DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
Document doc = docBuilder.parse("sampleResponse.xml");
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));
Schema schema = schemaFactory.newSchema(schemaSource);
Validator validator = schema.newValidator();
Source source = new DOMSource(doc);
// Set a custom error handler that simple re-throws every exception
validator.setErrorHandler(new ValidationErrorHandler());
validator.validate(source);
Run Code Online (Sandbox Code Playgroud)
问题是这一行:
Source schemaSource = new StreamSource(getClass().getResourceAsStream("/" + "SampleResponse.xsd"));
Run Code Online (Sandbox Code Playgroud)
如果我将模式作为文件读取,它可以工作:
Source schemaSource = new StreamSource(new File("somepath/SampleResponse.xsd"));
Run Code Online (Sandbox Code Playgroud)
当我直接从类路径获取模式时,为什么验证不起作用?
(在Windows 7 64位上使用Java 1.6)
失败时的异常消息:
Could not validate against schema SampleResponse.xsd. …
我正在尝试进行xml验证.我在运行时获得了一个模式列表(可能包含在jar中).验证根据我向SchemaFactory提供模式的顺序传递或失败.
这是我在做的事情:
private void validateXml(String xml, List<URI> schemas){
Source[] source = new StreamSource[schemas.size()];
int i=0;
for (URI f : schemas){
source[i++] = new StreamSource(f.openStream());
}
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NA_URI);
sf.setResourceResolver(new MyClassPathResourceResolver());
Schema schema = schemaFactory.newSchema(source);
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new ByteArrayInputStream(xml.getBytes()));
Run Code Online (Sandbox Code Playgroud)
再次,如果传递的模式集不是以xml的根元素引用的模式开始,则会失败.有没有解决这个问题或者我做错了什么?
我需要编写一个嵌入式XML模式,即该模式是在与数据相同的XML中定义的。
我试图了解如何正确执行此操作,但到目前为止,我还没有获得通过验证的简单示例。这是我尝试用作带有内联架构的简单示例XML的内容:(
注意:XML结构(例如,根/项目)已经大肆使用,因此我被约束为无法在数据元素上使用名称空间)
<?xml version="1.0"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="#mySchema">
<xs:schema id="mySchema" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="item" type="xs:string"
maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<item>String 1</item>
<item>String 2</item>
<item>String 3</item>
</root>
Run Code Online (Sandbox Code Playgroud)
但是,当我通过w3.org XML Schema Validator运行该XML时,该XML验证失败,并显示以下错误消息,它不希望将其<xs:schema>视为子元素!
每个cvc-complex-type.1.2.4无效: 元素{ http://www.w3.org/2001/XMLSchema }:此处不允许元素{None}:root中的模式(1),期望[{None}:项目,$]:
问:能否给我展示一个简单的XML文档的示例,该示例具有通过验证的内联模式定义?
我们使用probatron和saxon在我们的java应用程序中使用给定的sch文件验证测试xml .最近,sch文件中添加了一条新规则,例如
<let name="foo" value="base-uri()">
Run Code Online (Sandbox Code Playgroud)
并且一些规则使用该值,但是$ foo包含空字符串并且规则失败.我在哪里设置这个值?我在测试xml中添加了xml:base标签,如https://www.w3.org/TR/xmlbase/中所述,但它没有用.我是否必须在java方面设置?
编辑 (找到解决方案)我们使用probatron4j进行基于java的schematron处理:
Java源代码:
javax.xml.transform.TransformerFactory t = org.probatron.Utils.getTransformerFactory();
// create xml readers, perfor template processing, apply xslt
// as stated in the probatron4j examples
// ...
t.transform(getCandidateSource(), new StreamResult(baos));
Run Code Online (Sandbox Code Playgroud)
我们的修复包括:
Source source = new StreamSource(new FileInputStream(..
// or
Source source = new StreamSource(canditateURL.openStream()..
// depending on whether input source is file or url based
// below is the fix, we set path of file …Run Code Online (Sandbox Code Playgroud) I'm try to verify signature like this (it's PARes from Mastercard) and receive false every time, but xml from VISA work ok
Mastercard
<?xml version="1.0" encoding="UTF-8"?>
<ThreeDSecure><Message id="89e8bafa-755d-4ae9-a357-8641f13f057f"><PARes id="PARes-3cz1Jjfc"><version>1.0.2</version><Merchant><acqBIN>521324</acqBIN><merID>100000000000020</merID></Merchant><Purchase><xid>Z0FSSEFabjE1MTU2NTg2MTAzODY=</xid><date>20180111 08:16:50</date><purchAmount>1000</purchAmount><currency>643</currency><exponent>2</exponent></Purchase><pan>0000000000002290</pan><TX><time>20180111 08:17:00</time><status>Y</status><cavv>jNsniZHx4MT1DxEhZAITCFAAAAA=</cavv><eci>02</eci><cavvAlgorithm>3</cavvAlgorithm></TX></PARes><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></SignatureMethod><Reference URI="#PARes-3cz1Jjfc"><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></DigestMethod><DigestValue>8I/izdCJcp7wABf2YfFQbd4Ktxg=</DigestValue></Reference></SignedInfo><SignatureValue>IQuLAtGT8rEFp/a5bV9Wu8qiSXpTGtvkJaJCuPTrflwPFFwiSLuivfcInX8pzirmObPV9ue4Kn8YFu+ltiYg8g2sHMa6S9RfC330+/ntBL2XxNp6IO+s7anGsM5WOmd3Pt176Ft5DRDOpeJg8N9PtbhYPQ//TzzehApb9/EMnpFZKEnJbYYl5Wpa7gPV+iIJJryAdZF3CW3c6/ns/XzwQZ9Tfm9t24SRbF2U/Hkn7aD6MUug772hqNiOHQJ0gtdtDxR9KkQfh3aNq5EmS2MEgfoCkm8mUOO/fQEOMBy2fbgE4/JnDZ/7n2x/hDKZZn9oUv7BLvoM1IcjfYKRiEve7g==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDzzCCAregAwIBAgIRAO6hkq6XAdKvA5IMAj3E95MwDQYJKoZIhvcNAQEFBQAwgYAxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdvcmxkd2lkZTEuMCwGA1UECxMlTWFzdGVyQ2FyZCBXb3JsZHdpZGUgU2VjdXJlQ29kZSBHZW4gMjEiMCAGA1UEAxMZUFJEIE1DIFNlY3VyZUNvZGUgUm9vdCBDQTAeFw0xMjA2MjIwOTA4MzBaFw0yNTA2MjIwOTA4MzFaMIGAMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUTWFzdGVyQ2FyZCBXb3JsZHdpZGUxLjAsBgNVBAsTJU1hc3RlckNhcmQgV29ybGR3aWRlIFNlY3VyZUNvZGUgR2VuIDIxIjAgBgNVBAMTGVBSRCBNQyBTZWN1cmVDb2RlIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDptCms6aI22T9ST60k487SZP06TKbUBpom7Z1Bo8cQQAE/tM5UOt3THMdrhT+2aIkj9T0pA35IyNMCNGDt+ejhy7tHdw1r6eDX/KXYHb4FlemY03DwRrkQSH/L+ZueS5dCfLM3m2azxBXtrVXDdNebfht8tcWRLK2Ou6vjDzdIzunuWRZ6kRDQ6oc1LSVO2BxiFO0TKowJP/M7qWRT/Jsmb6TGg0vmmQG9QEpmVmOZIexVxuYy3rn7gEbV1tv3k4aG0USMp2Xq/Xe4qe+Ir7sFqR56G4yKezSVLUzQaIB/deeCk9WU2T0XmicAEYDBQoecoS61R4nj5ODmzwmGyxrlAgMBAAGjQjBAMA8GA1UdEwQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQqFTcxVDO/uxI1hpFF3VSSTFMGujANBgkqhkiG9w0BAQUFAAOCAQEAhDOQ5zUX2wByVv0Cqka3ebnm/6xRzQQbWelzneDUNVdctn1nhJt2PK1uGV7RBGAGukgdAubwwnBhD2FdbhBHTVbpLPYxBbdMAyeC8ezaXGirXOAAv0YbGhPl1MUFiDmqSliavBFUs4cEuBIas4BUoZ5Fz042dDSAWffbdf3l4zrU5Lzol93yXxxIjqgIsT3QI+sRM3gg/Gdwo80DUQ2fRffsGdAUH2C/8L8/wH+E9HspjMDkXlZohPII0xtKhdIPWzbOB6DOULl2PkdGHmJc4VXxfOwE2NJAQxmoaPRDYGgOFVvkzYtyxVkxXeXAPNt8URR3jfWvYrBGH2D5A44Atg==</X509Certificate><X509Certificate>MIIEXDCCA0SgAwIBAgIRANcgQkwhTlImGuZQ3AEXtKkwDQYJKoZIhvcNAQEFBQAwgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdvcmxkd2lkZTEuMCwGA1UECxMlTWFzdGVyQ2FyZCBXb3JsZHdpZGUgU2VjdXJlQ29kZSBHZW4gMjEoMCYGA1UEAxMfUFJEIE1DIFNlY3VyZUNvZGUgSXNzdWVyIFN1YiBDQTAeFw0xNzAzMzAwOTI4MDdaFw0yMTAzMjkwOTI2NTBaMFUxCzAJBgNVBAYTAlJVMRYwFAYDVQQKEw1KU0MgQWxmYS1CYW5rMR0wGwYDVQQLExQ2NDM0IC0gSlNDIEFsZmEtQmFuazEPMA0GA1UEAxMGTUNTaWduMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnwIwC77LQtKfDk6FpFzUSP1EMpGc0YsxS3bYPzOo09mRNDl3UlGYyYFmKVG0/BiPNqBBzV50CEXYHljoO7o5V8iUs5rVA2mWR6fDSQdbZBEcTiJZxWUon4wh2Xgsg7nznFfljTKoszdbKdTc5JP3ESPR1jPsloBuOeVZQI4zkNhricSwP9cYWxWa+zUUvXe5HCaes0VnQqmiw9o+GIB3aiyUd8eogAQvyiG77RUUp+vid0k/Fcvx/3WlwLcZAxzHB36UHSsvlqbrDl1vFTh9sJ2OPiOAJbNEn0ru6ESkmyBQZmyOo7A6uTafO/319dtl5/TLos43e4Cy8biOYa1jvQIDAQABo4H0MIHxMIGmBgNVHSMEgZ4wgZuhgYakgYMwgYAxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdvcmxkd2lkZTEuMCwGA1UECxMlTWFzdGVyQ2FyZCBXb3JsZHdpZGUgU2VjdXJlQ29kZSBHZW4gMjEiMCAGA1UEAxMZUFJEIE1DIFNlY3VyZUNvZGUgUm9vdCBDQYIQQ3EBfDozHhKp3pmzcHr6ZzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIHgDArBgNVHRAEJDAigA8yMDE3MDMzMDA5MjgwN1qBDzIwMjAwMzI5MDkyODA3WjANBgkqhkiG9w0BAQUFAAOCAQEA0uVJnNTtR8rkR9v6hDfp4Myg3Fl/9fEmjnaTeZXnjS2Yh0hYDaWzOi2vN9GrTcZiTlmMu55+/EgseYOWoa4lPFL3pk9hWxlPW/ZUeoX1c39G08BVS4fKtf6OlBCOOVT2rF3Pz12L+Q2c89b1TKQ3+J5z4NMuSAudX2jZlS15GNpyyeBd+4iygSQfG3oYaCD6lv2hVmT2G7ZhLIagMt6bNikfpA1295RDAhXCuxVs+Eqy8Llr0FdOjge+L7htQjJtvSvidGjnod74HuafsTlu9yJKQxLHO9guOLgE74QYiN7xkrIZE5IfvCE+qV8T79jPyF3FG88LoWpno9YhV7zZfg==</X509Certificate><X509Certificate>MIIEgDCCA2igAwIBAgIQQ3EBfDozHhKp3pmzcHr6ZzANBgkqhkiG9w0BAQUFADCBgDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFE1hc3RlckNhcmQgV29ybGR3aWRlMS4wLAYDVQQLEyVNYXN0ZXJDYXJkIFdvcmxkd2lkZSBTZWN1cmVDb2RlIEdlbiAyMSIwIAYDVQQDExlQUkQgTUMgU2VjdXJlQ29kZSBSb290IENBMB4XDTEyMDYyMjA5MjIxNFoXDTI1MDYyMTA5MjIxNVowgYYxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRNYXN0ZXJDYXJkIFdvcmxkd2lkZTEuMCwGA1UECxMlTWFzdGVyQ2FyZCBXb3JsZHdpZGUgU2VjdXJlQ29kZSBHZW4gMjEoMCYGA1UEAxMfUFJEIE1DIFNlY3VyZUNvZGUgSXNzdWVyIFN1YiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANaeBgfjTKIFls7ueMTzI2nYwAbocHwkQqd8BsIyJbZdk21E+vyq9EhX1NIoiAhP7fl+y/hosX66drjfrbyspZLalrVG6gYbdB2j2Sr8zBRQnMZKKluDwYv/266nnRBeyGYW3FwyVu8L1ACYQc04ACke+07NI/AZ8OXQSoeboEEGUO520/76o1cER5Ok9HRi0jJD8E64j8dEt36Mcg0JaKQiDjShlyTw4ABYyzZ1Vxl0/iDrfwboxNEOOooC0rcGNnCpISXMWn2NmZH1QxiFt2jIZ8QzF3/z+M3iYradh9uZauleNqJ9LPKr/aFFDbe0Bv0PLbvXOnFpwOxvJODWUj8CAwEAAaOB7TCB6jAPBgNVHRMECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUwTArnR3hR1+Ij1uxMtqoPBm2j7swgacGA1UdIwSBnzCBnKGBhqSBgzCBgDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFE1hc3RlckNhcmQgV29ybGR3aWRlMS4wLAYDVQQLEyVNYXN0ZXJDYXJkIFdvcmxkd2lkZSBTZWN1cmVDb2RlIEdlbiAyMSIwIAYDVQQDExlQUkQgTUMgU2VjdXJlQ29kZSBSb290IENBghEA7qGSrpcB0q8DkgwCPcT3kzANBgkqhkiG9w0BAQUFAAOCAQEA3lJuYVdiy11ELUfBfLuib4gPTbkDdVLBEKosx0yUDczeXoTUOjBEc90f5KRjbpe4pilOGAQnPNUGpi3ZClS+0ysTBp6RdYz1efNLSuaTJtpJpoCOk1/nw6W+nJEWyDXUcC/yVqstZidcOG6AMfKU4EC5zBNELZCGf1ynM2l+gwvkcDUv4Y2et/n/NqIKBzywGSOktojTma0kHbkAe6pj6i65TpwEgEpywVl50oMmNKvXDNMznrAG6S9us+OHDjonOlmmyWmQxXdU1MzwdKzPjHfwl+Z6kByDXruHjEcNsx7P2rUTm/Bt3SWW1K48VfNNhVa/WctTZGJCrV3Zjl6A9g==</X509Certificate></X509Data></KeyInfo></Signature></Message></ThreeDSecure>
Run Code Online (Sandbox Code Playgroud)
My validation code
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder builder = dbf.newDocumentBuilder();
final InputStream stream = new ByteArrayInputStream(xmlDoc.getBytes(StandardCharsets.UTF_8));
Document doc = builder.parse(stream);
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new XMLSignatureException("Cannot find Signature element");
}
DOMValidateContext valContext = new DOMValidateContext(new …Run Code Online (Sandbox Code Playgroud) 假设我有一个命名空间元素的 XML 架构定义,我希望将其用作第二个命名空间中 XML 元素的子元素。
举个例子,假设我们有文件foo.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:foo-ns" targetNamespace="urn:foo-ns"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="foo" type="fooType"/>
<xs:complexType name="fooType">
<xs:attribute name="id" use="required"/>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
以及文件bar.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="urn:bar-ns"
targetNamespace="urn:bar-ns"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:foo-ns="urn:foo-ns"
elementFormDefault="qualified">
<xs:import namespace="urn:foo-ns" schemaLocation="foo.xsd"/>
<xs:element name="bar" type="barType"/>
<xs:complexType name="barType">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:element name="foo" type="foo-ns:fooType"/>
</xs:sequence>
<xs:attribute name="name" use="required"/>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
那么我期望以下文件bar.xml是有效的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<bar name="myBar" xmlns="urn:bar-ns">
<foo id="myFoo" xmlns="urn:foo-ns"/>
</bar>
Run Code Online (Sandbox Code Playgroud)
然而,我的 XML 验证器抱怨 foo 元素的命名空间声明;相反,它坚持以下文件有效:
<?xml version="1.0" encoding="UTF-8"?> …Run Code Online (Sandbox Code Playgroud) 目前,我正在抓取远程站点的XML feed并在我的服务器上保存本地副本以便在PHP中进行解析.
问题是如何在PHP中添加一些检查以查看feed.xml文件是否有效,如果是,请使用feed.xml.
如果错误无效(有时远程XML提供某些显示空白feed.xml),请从之前的抓取/保存中提供feed.xml的备份有效副本?
代码抓取feed.xml
<?php
/**
* Initialize the cURL session
*/
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL,
'http://domain.com/feed.xml');
/**
* Create a new file
*/
$fp = fopen('feed.xml', 'w');
/**
* Ask cURL to write the contents to a file
*/
curl_setopt($ch, CURLOPT_FILE, $fp);
/**
* Execute the cURL session
*/
curl_exec ($ch);
/**
* Close cURL session and file
*/
curl_close ($ch);
fclose($fp);
?>
Run Code Online (Sandbox Code Playgroud)
到目前为止只有这个加载它 …
xml-validation ×10
xml ×9
xsd ×6
java ×4
php ×2
.net ×1
c# ×1
curl ×1
domdocument ×1
saxon ×1
xml-dsig ×1
xml-parsing ×1