MSDN によると:
defattr
タイプ: System.Boolean true
の
場合、 XmlReaderから既定の属性をコピーします。それ以外の場合はfalse。trueの場合はデフォルトの属性を使用します。それ以外の場合はfalse。
そして私の質問は、著者はこれによって何を意味するのですか?
MSDN によると:
defattr
タイプ: System.Boolean true
の
場合、 XmlReaderから既定の属性をコピーします。それ以外の場合はfalse。trueの場合はデフォルトの属性を使用します。それ以外の場合はfalse。
そして私の質問は、著者はこれによって何を意味するのですか?
XMLスキーマは、特定の属性をデフォルト値を持つものとして定義できます。これはそれらの属性を参照していると思います-明示的に指定されていない場合、デフォルト値で返される必要がありますか?
これを確認しました。次のスキーマを作成しました。
<?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() メソッドからの出力にも表示されます。
XmlReaderクラスのGetAttribute(派生クラスでオーバーライドされると、属性の値を取得します。)のこの関数のため、trueはXmlReaderから属性をコピーすることを意味すると思います。
EDIT:属性は日付部分です(1行目)
<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 に設定して関数を試してみるのはどうですか。たぶん、違いを見つけてここに投稿できます:)