我的C#/ .NET应用程序读取由用户手动编辑的XML文件.应用程序的文档中描述了允许的元素和标记.我正在使用LINQ从XML文件中提取数据.
在从XML文件中提取数据之前,我想验证它是否具有预期的结构.如果没有,那么获得有关错误的信息会很好,这样我就可以给用户一些回馈.
在C#中最简单的方法是什么?
我得到一个带有XML的字符串变量,并有一个XSD文件.我必须根据XSD文件验证字符串中的XML,并知道有多种方法(XmlDocument,XmlReader,...?).
验证后我只需要存储XML,所以我不需要它在XDocument或XmlDocument中.
如果我想要最快的表现,那该怎么办?
libxml2最新版本是否支持XSD 1.1进行XML验证?
我使用libxml2 v2.6.30进行XSD(schema)1.0的XML验证.但是,我不支持XSD v1.1.我不确定最新版本的libxml2是否支持XSD 1.1.任何的想法?
我尝试使用XSD文件验证我的XML文件,但是我收到以下错误消息:
[错误]:cvc-complex-type.2.3:元素'paragraph'不能包含字符[children],因为类型的内容类型只是元素
哪个(如果我正确理解它)意味着复杂类型不能将简单和复杂类型元素组合为子元素.
但是我该如何解决这个问题呢?我还是有点新手,所以解决方案可能很简单吗?
我的代码如下所示:
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="biography">
<xs:complexType>
<xs:sequence>
<xs:element name="paragraph" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name">
<xs:complexType>
<xs:sequence>
<xs:element name="first_name" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="last_name" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="emphasize" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="profession" maxOccurs="unbounded" minOccurs="0" type="xs:string"></xs:element>
<xs:element name="date" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="month" type="xs:string"></xs:element>
<xs:element name="day" type="xs:int"></xs:element>
<xs:element name="year" type="xs:int"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="definition" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="term" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)
XML: …
我希望能够为多种扩展类型指定单选类型.
例如,说我们有海,在海里有很多种鱼.所以在XML中我会写:
<Sea name="Atlantic Ocean">
<Tuna name="tuna1" />
<Carp name="carp1" />
<Carp name="carp2" />
<Tuna name="tuna2" />
<Salmon name="salmon1" />
</Sea>
Run Code Online (Sandbox Code Playgroud)
<xs:complexType name="Fish">
</xs:complexType>
<xs:complexType name="Salmon">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Carp">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Tuna">
<xs:complexContent>
<xs:extension base="Fish">
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Sea">
<xs:complexContent>
<xs:extension base="GeoZone">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:choice>
<xs:element type="Fish" name="Fish" minOccurs="0"
maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="Name" type="xs:string" use="optional" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是无效的,因为我只能添加类型Fish本身而不是其扩展类型.
我有一个包含请求和响应元素的wsdl:
<xsd:element name="someRequest" type="ns:SomeRequest"/>
<xsd:element name="someResponse" type="ns:SomeResponse"/>
Run Code Online (Sandbox Code Playgroud)
这个wsdl导入了一些xsd,其中包含这些complexTypes:
<xsd:complexType name="SomeRequest">
...
</xsd:complexType>
<xsd:complexType name="SomeResponse">
...
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)
我想针对这个wsdl验证一个xml,但我无法让它工作.我基本上使用http://actimem.com/java/jaxb-validation/#Marshalling_Validation上描述的方法,通过编组对象并设置Schema和EventHandler.
如果我将Schema设置为xsd,它将无法验证,因为xsd中没有元素.这很合乎逻辑,我对其他工具也一样.当我使用wsdl作为Schema时,由于内联文档,我收到此错误:
s4s-elt-character: Non-whitespace characters are not allowed in schema elements other than 'xs:appinfo' and 'xs:documentation'.
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个验证?
由于我正在使用设置工作流来处理现有项目(目前使用Xmlbeans而不是JAXB),因此我必须使用一些约束:
我尝试过转换模式以手动添加元素,但我找不到在现有Schema对象上执行此操作的方法.如果我通过DOM操作执行此操作,我将新模式作为String对象获取,它不会解析为Schema,因为无法找到导入的xsd.
如果我将jar中的xsd复制到项目中,我可以对它们进行转换并使验证成功,但我并不喜欢这个解决方案.如果没有别的办法,我会回过头来看,但我想找到一种解决方案,在重复使用这种方法时,尽可能少的工作,并且最不容易出错.其他开发人员将使用此代码和1验证方法,而无需额外的工作步骤将是完美的.
我之前遇到了基本上这个问题,然后也找不到解决方案.但之前,complexType不是根元素,我可以将它包装到其他对象中,直到我找到一个在xsd中表示为元素的对象.
只是想知道在搜索xml文档时是否可以忽略c#和xpath的情况?
的test.xml:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE email SYSTEM "test.dtd">
<email>
<von>test@test.com</von>
<zu>xxx@example.com</zu>
<titel>Hello</titel>
<text>Dear John....;-).</text>
<prior type="schnell"/>
</email>
Run Code Online (Sandbox Code Playgroud)
test.dtd:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE email [
<!ELEMENT email (von,zu,titel,text,prior)>
<!ELEMENT von (#PCDATA)>
<!ELEMENT zu (#PCDATA)>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT text (#PCDATA)>
<!ATTLIST prior type CDATA #REQUIRED >
]>
Run Code Online (Sandbox Code Playgroud)
test.dtd中的错误代码
文档类型声明包含或指向的标记声明必须格式正确.[2]
请帮忙!!
我使用Visual StudioXML工具创建了XSD.我使用以下C#代码来验证XML并面临此错误.
错误
该元素未声明为" http://www.w3.org/2000/09/xmldsig#:Signature ".
所以我的问题是如何解决它,因为在编辑模式下XML有效100%?
谢谢!
C#
private void buttonValidateXML_Click(object sender, EventArgs e)
{
try
{
bool result = IsValidXml2(textBoxSignedXML.Text, textBoxXSDFile.Text, "");
rtbValidationResult.Text = result.ToString();
}
catch (Exception ex)
{
rtbValidationResult.Text = ex.Message;
}
}
public static bool IsValidXml2(string xmlFilePath, string xsdFilePath, string namespaceName)
{
var xdoc = XDocument.Load(xmlFilePath);
var schemas = new XmlSchemaSet();
schemas.Add(namespaceName, xsdFilePath);
bool result = true;
xdoc.Validate(schemas, (sender, e) =>
{
result = false;
});
return result;
}
Run Code Online (Sandbox Code Playgroud)
XML
<?xml version="1.0" encoding="utf-8"?>
<Envelope version="1"> …Run Code Online (Sandbox Code Playgroud) 我正在使用以下代码创建一个 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 来做到这一点。
但是,我偶然发现了 …