2009-12-08 10 views
3

Selon MSDN:
defattr
Type: System.Boolean
Si vrai, copiez les attributs par défaut du XmlReader; sinon false .Si true, utilisez les attributs par défaut; sinon false.Quelqu'un peut-il m'expliquer quelle est la signification du paramètre booléen de la méthode System.Xml.XmlDictionaryWriter.WriteNode (XmlReader, bool)?

Et ma question est ce que l'auteur veut dire par là?

+0

Je l'ai remarqué l'autre jour. Qu'est-ce qu'un attribut par défaut? Pourquoi pourrais-je vouloir le copier? –

+0

... euh, ce sont les questions que je me posais quand je lisais le même document. –

Répondre

3

Chaque élément xml a un attribut par défaut. Même s'il n'y a pas d'attribut lorsque vous examinez le fichier XML brut, vous constaterez que si vous passez par un code d'analyseur XML lorsqu'il utilise une méthode comme MoveToNextAttribute(), il y aura un attribut xmlns dont la valeur est un w3c uri (je ne me souviens pas l'uri exact - quelque chose comme xmlns = 'http://www.w3c.org/schema' Vous le verrez aussi dans la sortie de la méthode ReadOuterXml() pour n'importe quel élément

+0

'xmlns' n'est pas ce qu'ils entendent par" attribut par défaut ". Vois ma réponse. –

1

Je pense que cela signifie que la vraie copie les attributs du XmlReader, en raison de cette fonction dans la classe XmlReader GetAttribute (En cas de substitution dans une classe dérivée, obtient la valeur d'un attribut.)

EDIT: Un attribut est la partie date (1ère ligne)

<note date="12/11/2002"> 
<to>Tove</to> <from>Jani</from> 
<heading>Reminder</heading> 
<body>Don't forget me this weekend!</body> </note> 

La date ne peut pas être écrite automatiquement. Pourquoi ne pas essayer la fonction avec l'ensemble booléen à true et false. Peut-être que vous pouvez repérer les différences et poster ici :)

+0

Pouvez-vous élaborer votre réponse un peu? Je dois admettre que je ne l'ai pas fait. – mark

+0

cela signifie qu'il ne va pas seulement copier les attributs explicitement spécifiés, mais aussi ceux avec des valeurs par défaut. –

4

Un schéma XML peut définir certains attributs comme ayant des valeurs par défaut. ?. à ces attributs - doivent-ils être retournés, avec leurs valeurs par défaut, quand ils ne sont pas spécifiés explicitement


Je confirme ce que j'ai créé le schéma suivant:

<?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> 

J'ai lu le document suivant par un XmlReader configuré avec le schéma:

<?xml version="1.0" encoding="utf-8" ?> 
<HasDefaultAttributes xmlns="http://tempuri.org/ElementWithDefaultAttributes.xsd" 
    nodefault="none"> 
    <Inner>text</Inner> 
</HasDefaultAttributes> 

Malgré cela, quand je XmlDictionaryWriter.WriteNode(reader, true), je suis le résultat suivant:

<?xml version="1.0" encoding="utf-16"?> 
<HasDefaultAttributes nodefault="none" default1="value1" default2="value2" 
    xmlns="http://tempuri.org/ElementWithDefaultAttributes.xsd"> 
    <Inner>text</Inner> 
</HasDefaultAttributes> 

code:

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; 
      } 
     } 
    } 
} 
+0

+1 (10 si je le pouvais) pour la réponse bien pensée et testée. Pour le mauvais l'OP a accepté l'autre réponse sans aucune vérification. –