gpt4 book ai didi

.net - XmlReader 从架构中获取元素默认值

转载 作者:行者123 更新时间:2023-12-04 07:07:58 26 4
gpt4 key购买 nike

这可能是一个关于 XmlReader 的幼稚问题,但我还没有在 MSDN 文档中找到答案。

假设我有 XSD SchemaTest.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="pageSettings">
<xs:complexType>
<xs:sequence>
<xs:element name="width" type="xs:decimal" default="8.5" minOccurs="0"/>
<xs:element name="height" type="xs:decimal" default="11" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

结构良好 XML文档 SchemaTest.xml符合这个模式
<?xml version="1.0" encoding="utf-8" ?>
<pageSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="SchemaTest.xsd">
<width/>
<height>11</height>
</pageSettings>

并且我尝试使用 XmlReader 阅读此文档如下。
static void Main(string[] args) {
decimal width;
decimal height;

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreWhitespace = true;
settings.Schemas.Add(null, "C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xsd");
using (XmlReader reader = XmlReader.Create("C:\\Projects\\SchemaTest\\SchemaTest\\SchemaTest.xml", settings)) {
reader.ReadStartElement();
if (reader.Name == "width") {
width = reader.ReadElementContentAsDecimal("width", "");
// if fail, width = default from schema
}
if (reader.Name == "height") {
height = reader.ReadElementContentAsDecimal("height", "");
// if fail, height = default from schema
}
reader.ReadEndElement();
}
}

目前我收到了 System.FormatException表示元素上的内容 width格式不正确。看来 reader正在尝试读取元素中的内容,并且没有默认为架构中指定的默认值。处理这个问题的正确方法是什么?

此外,我的理解是,对于元素,模式仅在元素出现空内容时提供默认值,但如果元素丢失,则不提供默认值。这是否意味着无法为丢失的可选元素获取默认值?

最佳答案

至于处理空元素,设置 settings.ValidationType = ValidationType.Schema并且您应该根据需要获得默认值。

关于缺失的元素,这些元素被认为是缺失的 ;-),因此没有默认值。理论上,您可以解析架构(例如使用架构对象模型)来获取默认值。但这将违反规范。

您是否考虑过使用属性,例如 <pageSettings height="55"/> ?在这种情况下,您应该获得缺失属性的默认值。

关于.net - XmlReader 从架构中获取元素默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821188/

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