gpt4 book ai didi

c# - 使用 XML 命名空间在 C# 中针对模式创建和验证 XML

转载 作者:太空宇宙 更新时间:2023-11-03 13:45:31 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何根据 C# 中的架构验证 XML。如果 XML 很简单并且不使用任何 namespace 元素,那么一切似乎都很好。但是,如果它使用 XML namespace ,我就会遇到问题。

我要生成的 XML 是:

<?xml version="1.0" encoding="utf-8"?>
<SlideDeck xmlns:xy="http://something.com" xy:type="SlideDefinitions">
<Slide>...</Slide>
<Slide>...</Slide>
...
</SlideDeck>

我可以在 C# 中使用等价于以下内容生成此内容:

XmlDocument xDoc = new XmlDocument();
XmlElement xSlideDeck = xDoc.CreateElement("SlideDeck");
xDoc.AppendChild(xSlideDeck);

xSlideDeck.SetAttribute("xmlns:xy", "http://something.com");
xSlideDeck.SetAttribute("type", "http://something.com", "SlideDefinitions");

我可以尝试用这个来验证生成的 XML 文档:

xDoc.Schemas.Add("", "Schema.xsd");
xDoc.Validate(Handler);

要验证的 Schema.xsd 文件现在相当简单:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="SlideDeck">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Slide"/>
</xs:choice>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
... Slide Defined Here ...
</xs:schema>

运行验证时,出现以下错误:

The 'http://something.com:type' attribute is not declared.
The required attribute 'type' is missing.

我还尝试向引用 http://something.com 的 XmlDocument 添加额外的架构使用相同的架构文件(希望它能将其拉入“xy”命名空间)。我也试过只向正确的 uri 添加一个模式(省略没有 uri 的模式),但根据其他设置,没有任何验证。我试过使根“SlideDeck”元素属于 http://something.com命名空间也是如此。

知道这里会发生什么吗?我根本无法更改生成的 XML 文档的格式。我可以使“SlideDeck”元素与所有其他元素一起以“xy”为前缀,但我宁愿不必修改所有代码以将 uri 添加到命名空间和前缀来实现这一点。最大的症结在于 xmlns:xy 定义和 xy:type 属性,它们提醒接收者预期的内容。其他变化是合理的。我还可以控制程序验证的 XSD,如果让它创建和验证最好通过更改那里来完成的话。

最佳答案

您的架构表明 SlideDeck 元素必须具有 type 属性 - 两者都在 null 命名空间中,而在您的 XML 中 SlideDeck 元素在 http://something.com 命名空间中有一个属性 type - 因此出现错误。

您应该将 XML 更改为:

<SlideDeck type="SlideDefinitions">
<Slide>. . . </Slide>
<Slide>. . . </Slide>
. . .
</SlideDeck>

(即摆脱命名空间)。

或者,您必须更改架构,将其分成两部分:

typeAttr.xsd:

<xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xy="http://something.com"
xmlns="http://something.com"
targetNamespace="http://something.com"
elementFormDefault="qualified"
attributeFormDefault="qualified" >

<xs:attribute name="type" type="xs:string" />

</xs:schema>

slide.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xy="http://something.com">
<xs:import namespace="http://something.com" schemaLocation="typeAttr.xsd"/>
<xs:element name="SlideDeck">
<xs:complexType>
<xs:sequence>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Slide"/>
</xs:choice>
</xs:sequence>
<xs:attribute ref="xy:type" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="Slide"></xs:element>
</xs:schema>

(在同一目录中)。

通过这种方式,您可以在其单独的命名空间中定义 type 属性,并且原始 XML 可以正确验证。

关于c# - 使用 XML 命名空间在 C# 中针对模式创建和验证 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15488539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com