根据 MSDN:
defattr
类型:System.Boolean
如果为true ,则从XmlReader复制默认属性;否则为false。如果为true,则使用默认属性;否则为假。
我的问题是作者的意思是什么?
根据 MSDN:
defattr
类型:System.Boolean
如果为true ,则从XmlReader复制默认属性;否则为false。如果为true,则使用默认属性;否则为假。
我的问题是作者的意思是什么?
XML Schema 可以将某些属性定义为具有默认值。我认为这是指那些属性——如果没有明确指定它们,是否应该返回它们的默认值?
我已经证实了这一点。我创建了以下架构:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="ElementWithDefaultAttributes"
targetNamespace="http://tempuri.org/ElementWithDefaultAttributes.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/ElementWithDefaultAttributes.xsd"
xmlns:mstns="http://tempuri.org/ElementWithDefaultAttributes.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:complexType name="HasDefaultAttributesType">
<xs:sequence>
<xs:element name="Inner"/>
</xs:sequence>
<xs:attribute name="default1" default="value1" type="xs:string"/>
<xs:attribute name="nodefault" type="xs:string"/>
<xs:attribute name="default2" default="value2" type="xs:string"/>
</xs:complexType>
<xs:element name="HasDefaultAttributes" type="mstns:HasDefaultAttributesType"/>
</xs:schema>
我通过XmlReader
配置了架构阅读了以下文档:
<?xml version="1.0" encoding="utf-8" ?>
<HasDefaultAttributes xmlns="http://tempuri.org/ElementWithDefaultAttributes.xsd"
nodefault="none">
<Inner>text</Inner>
</HasDefaultAttributes>
尽管如此,当我使用 时XmlDictionaryWriter.WriteNode(reader, true)
,我得到了以下结果:
<?xml version="1.0" encoding="utf-16"?>
<HasDefaultAttributes nodefault="none" default1="value1" default2="value2"
xmlns="http://tempuri.org/ElementWithDefaultAttributes.xsd">
<Inner>text</Inner>
</HasDefaultAttributes>
代码:
public static XDocument DefaultAttributes()
{
var nt = new NameTable();
var schemas = new XmlSchemaSet(nt);
using (
var schemaText =
File.OpenText(
@"..\..\XmlDictionaryWriter\ElementWithDefaultAttributes.xsd"))
{
var schema = XmlSchema.Read(schemaText, ValidationEventHandler);
schemas.Add(schema);
}
var settings = new XmlReaderSettings
{
ValidationType = ValidationType.Schema,
Schemas = schemas
};
settings.ValidationEventHandler += ValidationEventHandler;
using (
var dataText =
File.OpenText(
@"..\..\XmlDictionaryWriter\HasDefaultAttributes.xml"))
{
using (var outputStream = new MemoryStream())
{
using (
var xdw =
System.Xml.XmlDictionaryWriter.CreateTextWriter(
outputStream, Encoding.UTF8, false))
{
using (var reader = XmlReader.Create(dataText, settings))
{
while (reader.Read())
{
xdw.WriteNode(reader, true);
}
}
}
outputStream.Position = 0;
using (var output = new StreamReader(outputStream))
{
var doc = XDocument.Load(output);
return doc;
}
}
}
}
每个 xml 元素都有一个默认属性。即使在检查原始 xml 时没有属性,您也会发现,如果您在使用 MoveToNextAttribute() 之类的方法时单步执行任何 xml 解析器代码,则会有一个值为 w3c uri 的 xmlns 属性(我不记得确切的 uri -something like xmlns=' http://www.w3c.org/schema ' 您还将在任何元素的 ReadOuterXml() 方法的输出中看到它。
我认为这意味着 true 将从 XmlReader 复制属性,因为 XmlReader 类GetAttribute中的此函数(在派生类中重写时,获取属性的值。)
编辑:属性是日期部分(第一行)
<note date="12/11/2002">
<to>Tove</to> <from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body> </note>
也许日期不会自动写入。如何尝试将布尔值设置为 true 和 false 的函数。也许您可以发现差异并在此处发布:)