我们如何在 Eclipse xml 编辑器中通过 schematron 或 xslt 验证 xml 文档?这个想法是使用一些基于规则的验证方法在 eclipse xml 编辑器中扩展 xml 文档实时验证。
我正在尝试针对现有的 XmlSchemaSet 验证传入的输入 xmlDocument。以下是代码:
public class ValidateSchemas
{
private bool _isValid = true;
public List<string> errorList = new List<string>();
public bool ValidateDocument(XmlDocument businessDocument)
{
XmlSchemaSet schemaSet = SchemaLoader.Loader();
bool isValid = Validate(businessDocument, SchemaLoader._schemaSet);
return isValid;
}
public bool Validate(XmlDocument document, XmlSchemaSet schema)
{
ValidationEventHandler eventHandler = new ValidationEventHandler(HandleValidationError);
document.Schemas = schema;
document.Validate(eventHandler);
return _isValid;
}
private void HandleValidationError(object sender, ValidationEventArgs ve)
{
_isValid = false; errorList.Add(ve.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
从验证的角度来看,代码运行良好。但是 errorList 仅捕获第一个节点错误。它不会捕获其他节点错误。看起来该事件仅被触发一次。如何做到这一点,请帮助。请注意,我将 xmldocument 作为输入,因此没有使用阅读器。
我正在使用javax.xml.validation.Validator针对XSD架构的类来验证内存中的DOM对象.SAXParseException每当在我填充DOM的信息中存在一些数据损坏时,我就会在验证期间抛出一个被抛出.
一个示例错误:
org.xml.SAXParseException:cvc-datatype-valid.1.2.1:'???? ?? [????? G?> p~tn ?? ~0?1]'无效'hexBinary'的价值.
我希望有一种方法可以在我的内存中找到这个错误的位置并打印出有问题的元素及其父元素.我目前的代码是:
public void writeDocumentToFile(Document document) throws XMLWriteException {
try {
// Validate the document against the schema
Validator validator = getSchema(xmlSchema).newValidator();
validator.validate(new DOMSource(document));
// Serialisation logic here.
} catch(SAXException e) {
throw new XMLWriteException(e); // This is being thrown
} // Some other exceptions caught here.
}
private Schema getSchema(URL schema) throws SAXException {
SchemaFactory schemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// Some logic here to specify a ResourceResolver
return …Run Code Online (Sandbox Code Playgroud) 这已经让我发疯了好几个小时。我已经阅读了关于 SO 和 Internet 其余部分的所有相关 XSD 问题,但似乎仍然没有答案。
我需要一个 XML 模式,它要求至少存在一个元素列表,但每个元素可能只出现 0 或 1 次。
这类似于这个问题: XML 模式构造“任何一个或多个这些元素,但必须至少是一个”
但我无法限制上限:我显然使用maxOccurs不正确。
这是我离开我的模式的地方:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Selects">
<xs:sequence minOccurs="2" maxOccurs="4">
<xs:choice>
<xs:element name="aaa" minOccurs="1" maxOccurs="1"/>
<xs:element name="bbb" minOccurs="1" maxOccurs="1"/>
<xs:element name="ccc" minOccurs="1" maxOccurs="1"/>
<xs:element name="ddd" minOccurs="1" maxOccurs="1"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:element name="baseElement">
<xs:complexType>
<xs:sequence>
<xs:element name="MyChoice" type="Selects"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
我尝试了minOccurs和maxOccurs上上之选,并没有运气的元素。这是验证的 XML,但我不希望它:
<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<ddd/>
<ddd/>
</MyChoice> …Run Code Online (Sandbox Code Playgroud) 好的。我想为 xmllint 设置目录文件来解决问题,以便从本地文档验证 dcterms xml 命名空间。我相信我已经做对了一切,但它似乎根本不起作用。
我正在运行 OSX。
我已经创建了一个目录 /etc/xml
$ mkdir /etc/xml
$ cd /etc/xml
Run Code Online (Sandbox Code Playgroud)
我已将 dcterms.xsd 下载到该目录
$ ls -l
-rw-r--r-- 1 ibis wheel 12507 24 Jul 11:42 dcterms.xsd
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为“目录”的文件
$ xmlcatalog --create > catalog
Run Code Online (Sandbox Code Playgroud)
我已将 dcterms 命名空间添加到目录文件中
$ xmlcatalog --noout --add uri http://purl.org/dc/elements/1.1/ file:///etc/xml/dc.xsd
$ xmlcatalog --noout --add uri http://purl.org/dc/terms/ file:///etc/xml/dcterms.xsd
$ cat catalog
<?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">
<uri name="http://purl.org/dc/elements/1.1/" uri="file:///etc/xml/dc.xsd"/>
<uri name="http://purl.org/dc/terms/" uri="file:///etc/xml/dcterms.xsd"/>
</catalog>
Run Code Online (Sandbox Code Playgroud)
在工作目录中,我创建了一个名为 Empty.xsd …
我尝试使用 lxml 验证一个大约有 100 万行的 xml 文件。这是我的代码。
import codecs
import lxml.etree as ET
xsd_file = codecs.open(r'test.xsd', 'rb', 'utf-8')
xml_file = codecs.open(r'test.xml', 'rb', 'utf-8')
xmlschema_doc = ET.parse(xsd_file)
xmlschema = ET.XMLSchema(xmlschema_doc)
doc = ET.parse(xml_file)
print (xmlschema.error_log.filter_from_errors())
Run Code Online (Sandbox Code Playgroud)
但是我发现如果错误行超过 65535,输出总是显示“65535:0”。也就是说,
file:///C:test.xml:65535:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element 'word': Missing child element(s).
file:///C:test.xml:65535:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element 'word': Missing child element(s).
file:///C:test.xml:65535:0:ERROR:SCHEMASV:SCHEMAV_ELEMENT_CONTENT: Element 'word': Missing child element(s).
Run Code Online (Sandbox Code Playgroud)
所以我无法确定上面的线条在哪里。有什么解决办法吗?
我一直在研究这种"高级"模式,感冒了几天,我无法弄清楚为什么它一直告诉我没有找到"网站".我重新阅读了这一章,甚至创建了一个实验的副本(之前有效),我不明白.我正在尝试导入和组合模式,我不知道如何让它正常工作......以下是错误:
Ln 16 Col 84 - cvc-elt.1:找不到元素'sites'的声明.1错误[Xerces-J 2.9.1]验证XML模式"sites.xsd"... Ln 32 Col 49 - src-resolve.4.1:解析组件"sites"时出错.检测到'sites'没有名称空间,但没有目标名称空间的组件不能从模式文档中引用.
如果'sites'意图具有命名空间,则可能需要提供前缀.如果"站点"没有名称空间,则应添加不带"名称空间"属性的"导入"
这是XML和架构:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://example.com/weekendfunsnacks/sites/ns"
targetNamespace="http://example.com/weekendfunsnacks/sites"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9/ns"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:import namespace="http://www.sitemaps.org/schemas/sitemap/0.9"
schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" />
<xs:element name="sites">
<xs:complexType>
<xs:sequence>
<xs:element name="site" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:byte" name="totalPages" />
<xs:element ref="sites" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>?
Run Code Online (Sandbox Code Playgroud) 我找到了一些关于这个问题的提示,但仍然没有帮助我.
这是我的XML
<?xml version="1.0" encoding="UTF-8"?>
<work xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.w3.org/2001/XMLSchema-instance"
tns:schemaLocation="myXSDSchema.xsd">
<tns:Objects>
<tns:Object Name=":" Location=":">
</tns:Object>
</tns:Objects>
</work>
Run Code Online (Sandbox Code Playgroud)
这是我的XSD文件:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns = "http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
(some checks)
</schema>
Run Code Online (Sandbox Code Playgroud)
我的XSD文件与XML位于同一文件夹中.
如何链接这2个文件?
我正在编写一个 XSD 来验证一个 XML,但是当我验证这个错误时出现了:
输出 - 错误
使用 XML 模式验证当前文件:
错误:元素“{ http://www.w3.org/2001/XMLSchema-instance }Gasto”:不需要此元素。预期是(加斯托)
......我不明白这个错误
这是我的 XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<Armazem>
<Lista_Gastos xmlns:artGasto="http://www.w3.org/2001/XMLSchema-instance"
artGasto:noNamespaceSchemaLocation="TraXSD.xsd">
<artGasto:Gasto id="50">
<artGasto:nome>Robalo</artGasto:nome>
<artGasto:quantidade>1</artGasto:quantidade>
</artGasto:Gasto>
</Lista_Gastos>
</Armazem>
Run Code Online (Sandbox Code Playgroud)
这是我的 XSD 示例:
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema elementFormDefault="qualified"
attributeFormDefault="unqualified"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:artGasto="http://www.w3.org/2001/XMLSchema-instance">
<xsd:element name="Armazem">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Lista_Gastos"
type="TListGastos" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="TListGastos">
<xsd:sequence >
<xsd:element name="Gasto" type="TGasto"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TGasto">
<xsd:sequence >
<xsd:element name="nome" type="xsd:string" />
<xsd:element name="quantidade" type="xs:integer" />
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="required"/> …Run Code Online (Sandbox Code Playgroud) 我正在使用javax.xml.validation.Validator来验证我的 xml,如下所示 -
Validator validator = myschema.newValidator();
validator.validate(new StreamSource(new StringReader(xmlString)));
Run Code Online (Sandbox Code Playgroud)
我想通过完全禁用 DTD(文档类型定义)来防止 XML 外部实体攻击,所以如果可能的话,我希望验证器在我的 xml 中出现 DTD 的情况下抛出异常。我已阅读有关使用DocumentBuilderFactory. 我如何在 Validator 中配置它?
xml-validation ×10
xml ×7
xsd ×7
java ×3
.net ×1
c# ×1
eclipse ×1
lint ×1
lxml ×1
owasp ×1
schematron ×1
security ×1
xmldocument ×1