xmlreader 스키마에서 요소 기본값을 가져옵니다
문제
이것은 아마도 순진한 질문 일 것입니다 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();
}
}
현재 나는 a System.FormatException
요소의 내용을 나타냅니다 width
올바른 형식이 아닙니다. 그것은 보인다 reader
요소의 컨텐츠를 읽으려고 노력하고 있으며 스키마에 지정된 기본값으로 기본값이 없습니다. 이것을 처리하는 올바른 방법은 무엇입니까?
또한 요소의 경우 스키마는 요소가 빈 콘텐츠로 표시되지만 요소가 누락 된 경우 기본값을 제공하지 않는 경우 기본값 만 제공한다는 것을 이해하고 있습니다. 이것은 누락 된 선택적 요소에 대한 기본값을 얻을 방법이 없다는 것을 의미합니까?
해결책
빈 요소로 작업하는 것에 관해서는 설정하십시오 settings.ValidationType = ValidationType.Schema
원하는대로 기본값을 가져와야합니다.
누락 된 요소와 관련하여, 그것들은 잘 고려되고, 누락 된 ;-) 따라서 기본값은 없습니다. 이론적으로, 스키마 (예 : 스키마 개체 모델을 사용하여)를 구문 분석하여 기본값을 얻을 수 있습니다. 그러나 그것은 사양에 위배 될 것입니다.
같은 속성 사용을 고려해 보셨습니까? <pageSettings height="55"/>
? 이 시나리오에서는 누락 된 속성에 대한 기본값을 가져와야합니다.