我有一个XML文件,我有一个XML模式.我想根据该模式验证该文件,并检查它是否符合该模式.我正在使用python,但如果在python中没有这样有用的库,我会对任何语言开放.
这里最好的选择是什么?我担心我能以多快的速度运行它.
目前,我正在开发一项功能,涉及解析从另一个产品收到的XML.我决定对一些实际的客户数据进行一些测试,看起来其他产品允许来自用户的输入被认为是无效的.无论如何,我仍然需要尝试找出解析它的方法.我们正在使用javax.xml.parsers.DocumentBuilder,我收到的输入错误如下所示.
<xml>
...
<description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>
...
</xml>
Run Code Online (Sandbox Code Playgroud)
正如您所知,描述中的内容似乎是无效的标记(<THIS-IS-PART-OF-DESCRIPTION>).现在,已知此描述标记是叶标记,并且不应在其中包含任何嵌套标记.无论如何,这仍然是一个问题,并产生例外DocumentBuilder.parse(...)
我知道这是无效的XML,但它可以预测无效.有关解析此类输入的方法的任何想法?
我试过阅读http://www.w3.org/TR/xml-infoset/和维基百科条目.但坦率地说,我仍然不确定区别是什么.
报价单 :
如果XML文档格式良好并且满足命名空间约束,则它具有信息集.为了获得信息集,不要求XML文档有效.
从维基百科条目似乎没有意义.非有效文档如何具有任何语义,因此它如何成为"信息"集?
什么是这个"信息集"
格式良好,满足命名空间约束
XML有?它本身以何种方式有用.换句话说,从语义上讲,为什么定义XML信息集是必要的?是否有任何无法用XML表示的信息?如果是这样,我可以看到XML Infoset的限制集,但是如果不确定XML Infoset与术语"信息"一样没有意义吗?
谢谢你的有趣答案: 我仍然无法理解为什么Xml信息集有任何目的而不是术语信息集.但是你们给了我这个问题的直接答案.
我正在尝试根据给定的XML文件开发XSD语法.给定的XML文件itemList.xml如下所示.
<?xml version="1.0" encoding = "utf-8"?>
<itemList
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com itemList.xsd" >
<item>spoon</item>
<item>knife</item>
<item>fork</item>
<item>cup</item>
</itemList>
Run Code Online (Sandbox Code Playgroud)
我开发的itemList.xsd文件如下所示.
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:co="http://www.w3schools.com"
targetNamespace="http://www.w3schools.com"
elementFormDefault="qualified">
<simpleType name="itemType">
<restriction base="string"/>
</simpleType>
<complexType name="itemListType">
<sequence>
<element name="item" type="co:itemType"/>
</sequence>
</complexType>
<element name="itemList" type="co:itemListType"/>
</schema>
Run Code Online (Sandbox Code Playgroud)
Cvc-complex-type.2.4.d: Invalid Content Was Found Starting With Element 'item'. No Child Element Is Expected At This Point.. Line '6', Column '12'.
Run Code Online (Sandbox Code Playgroud)
看来我应该重写我complexType的itemList.xsd,但我不知道该怎么做.非常感谢任何可以提供帮助的人.
我正在开发Apache CXF Web服务(使用JAX-WS,通过SOAP).服务本身非常简单:接收请求,将请求插入数据库,并返回插入是否成功.我想依靠XML验证来对请求强制执行许多约束.
所以,我的问题.如何将详细的验证错误返回给我的服务客户?我通过配置我的端点在服务器端进行了验证.
<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl">
<jaxws:properties>
<!-- This entry should- ideally- enable JAXB validation
on the server-side of our web service. -->
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
</jaxws:endpoint>
Run Code Online (Sandbox Code Playgroud)
我已经探索过在服务器上使用拦截器(例如BareInInterceptor),并以某种方式捕获SAXParseExceptions来包装它们并将它们发送到客户端.这种方法看起来有点复杂,但如果XML无效,我需要以某种方式为客户端提供一个行号.我应该使用拦截器来揭露异常吗?
我对这个技术堆栈并不是很有经验,只是进入Web服务 - 你们给我的任何指针都会非常感激.
我可以获得以下任一xml:
<?xml version="1.0" encoding="UTF-8"?>
<dc:video xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:title>
A vid with Pete
</dc:title>
<dc:description>
Petes vid
</dc:description>
<dc:contributor>
Pete
</dc:contributor>
<dc:subject>
Cat 2
</dc:subject>
</dc:video>
Run Code Online (Sandbox Code Playgroud)
要么:
<?xml version="1.0" encoding="UTF-8"?>
<video>
<title>
A vid with Pete
<title>
<description>
Petes vid
<description>
<contributor>
Pete
<contributor>
<subject>
Cat 2
<subject>
</video>
Run Code Online (Sandbox Code Playgroud)
我试图访问一个元素:
string title = xmlDocFromOneLan.SelectSingleNode(@"/video/title").InnerXml;
Run Code Online (Sandbox Code Playgroud)
但是对于xml文档1,它由于命名空间而无法工作.
c#中有没有办法使用xpath忽略命名空间?我只是想选择我真的不关心命名空间的节点.(命名空间可以是DC DN或DCN等).
"/视频"
会读到:
<video></video>
or
<dc:video></video>
or
<dcn:video></video>
Run Code Online (Sandbox Code Playgroud) NPM中的任何XML库是否支持针对XSD架构验证XML?
我会看自己,但是:
$ npm search xml 2>/dev/null | wc -l
212
Run Code Online (Sandbox Code Playgroud)
注意:xsd包不是它看起来node-xerces像是破碎/空.
我正在开发一个基于Mozilla XULRunner的应用程序.
我正在使用xhmtl1-strict.xsdW3C提供的属性来获取.现在要求将<video>标记添加到我的应用程序,但我的应用程序不支持任何HTML5元素或属性.
那么,有什么建议吗?
所以当我使用XML模式验证XML文件时,我只能知道它是失败还是通过,如果我想知道它为什么失败,我需要查看错误消息,如
[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'City'. One of '{Address1}' is expected.]
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,它失败,因为我缺少标记Address1.我的问题是当验证失败时,我能知道导致失败的标签吗?这是因为我需要为每个重要的缺失标记处理不同的故障.现在我的想法是
FileInputStream inputStream = null;
try{
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File(config.getXmlSchema()));
JAXBContext context = JAXBContext.newInstance(PackageLabel.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema(schema);
inputStream = new FileInputStream(xmlFile);
pl = (PackageLabel) unmarshaller.unmarshal(inputStream);
} catch (JAXBException e) {
if(pl.getAddress1() == null){
System.out.println("Invalid Mailing Address");
}
//EDIT: CANNOT DO THIS, SINCE pl IS NULL AT THIS POINT
//Some more logics …Run Code Online (Sandbox Code Playgroud) 我是 BBEdit & Co 的 Mac 用户。现在我使用 VS Code 使用 Windows。我正在寻找一种简单的解决方案来使用 VS Code 验证 XML。有扩展吗?
谢谢!
xml-validation ×10
xml ×7
xsd ×6
java ×2
jaxb ×2
cxf ×1
html5 ×1
infoset ×1
jax-ws ×1
node.js ×1
porting ×1
python ×1
python-2.7 ×1
validation ×1
web-services ×1
well-formed ×1
xml-parsing ×1
xpath ×1
xulrunner ×1