Как свернуть пустые теги XML? - PullRequest
2 голосов
/ 13 октября 2008

Я получаю XML так:

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

Это действительный XML, как вы знаете, но другая библиотека, которую я использую, отключена, и она будет принимать XML только в следующем формате:

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

Я уже читаю XML в XmlDocuments, манипулирую ими и переписываю их с помощью XmlWriter (), какой самый простой (и самый эффективный) способ для меня «свернуть» эти пустые теги?

Ответы [ 5 ]

4 голосов
/ 13 октября 2008

Установите для свойства IsEmpty каждого XmlElement, который вы хотите свернуть, значение true.

0 голосов
/ 03 августа 2016

Вот рекурсивный метод:

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

Используется так:

var doc = new XmlDocument();
doc.Load(inputFilePath);
FormatEmptyNodes(doc);
doc.Save(outputFilePath);
0 голосов
/ 14 октября 2008

Если вы уже используете XmlWriter для написания своего XML, он должен уже свернуть пустые элементы. Этот код (используя .Net 3.5):

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

испускает <foo bar='baz' />.

Если ваш XmlWriter нет, вам следует убедиться, что ваш код XmlWriter не генерирует текстовые узлы, которые вы не ожидаете.

0 голосов
/ 13 октября 2008

Вы можете попробовать это.

Подкласс XmlTextWriter с реализацией, в которой WriteFullEndElement вызывает base.WriteEndElement. Как это:

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

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

Затем запишите документ в экземпляр вашего подкласса, используя XmlDocument.WriteContentTo.

0 голосов
/ 13 октября 2008

Если вы используете объекты манипуляции DOM System.XML (XmlElement и т. Д.) Вместо XmlWriter, вы получаете это бесплатно.

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

Вы получите ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...