2008-10-13 10 views
2

Je reçois XML comme ceci:Comment est-ce que je réduis des étiquettes XML vides?

<Items> <Row attr1="val"></Row> <Row attr1="val2"></Row> </Items>

Ceci est XML valide, comme vous le savez, mais une autre bibliothèque que je utilise est en panne et il n'accepterons que XML dans ce format:

<Items> <Row attr1="val"/> <Row attr1="val2"/> </Items>

Je lis déjà le XML en xmldocuments, les manipuler et les réécrire en utilisant un XmlWriter(), ce qui est le plus facile (et plus efficace) façon pour moi de ces balises vides « effondrement »?

Répondre

4

Définissez la propriété IsEmpty de chaque XmlElement que vous voulez réduire à true.

0

Si vous utilisez les objets de manipulation DOM de System.XML (XmlElement etc) au lieu de XmlWriter, vous obtenez ceci gratuitement.

XmlElement items = xmlDoc.SelectNodes("items"); 
XmlElement row = xmlDoc.CreateElement("row"); 
items[0].appendChild(row); 

Vous obtiendrez une "< ligne/>"

0

Vous pouvez essayer.

Sous-classe XmlTextWriter avec une implémentation dont WriteFullEndElement appelle base.WriteEndElement. Comme ceci:

public class BetterXmlTextWriter : XmlTextWriter 
    { 
     public BetterXmlTextWriter(TextWriter w) 
      : base(w) 
     { 
     } 

     public override void WriteFullEndElement() 
     { 
      base.WriteEndElement(); 
     } 
    } 

écrire ensuite le document vers une instance de votre sous-classe en utilisant XmlDocument.WriteContentTo.

0

Si vous utilisez déjà un XmlWriter pour écrire votre fichier XML, il devrait déjà être en train de réduire les éléments vides. Ce code (en utilisant .Net 3.5):

XmlWriter xw = XmlWriter.Create(Console.Out); 
xw.WriteStartElement("foo"); 
xw.WriteAttributeString("bar", null, "baz"); 
xw.WriteEndElement(); 
xw.Flush(); 
xw.Close(); 

émet <foo bar='baz' />.

Si votre XmlWriter ne l'est pas, vérifiez que votre code XmlWriter n'émet pas de nœuds de texte inattendus.

0

Voici une méthode récursive:

private static void FormatEmptyNodes(XmlNode rootNode) 
{ 
    foreach (XmlNode childNode in rootNode.ChildNodes) 
    { 
     FormatEmptyNodes(childNode); 

     if(childNode is XmlElement) 
     { 
      XmlElement element = (XmlElement) childNode; 
      if (string.IsNullOrEmpty(element.InnerText)) element.IsEmpty = true; 
     } 
    } 
} 

Utilisé comme ceci:

var doc = new XmlDocument(); 
doc.Load(inputFilePath); 
FormatEmptyNodes(doc); 
doc.Save(outputFilePath); 
Questions connexes