Сокращение XML в .NET - PullRequest
       37

Сокращение XML в .NET

2 голосов
/ 11 ноября 2009

Я хотел бы прочитать в следующем XML:

<node></node>

А затем запишите это, уменьшенный, как это:

<node/>

Очевидно, что это имеет то же значение, но второй файл меньше для отправки по проводам.

Я пытаюсь найти способ сделать это в .NET. Кажется, я не могу найти параметр или параметр, которые бы сбрасывали ненужные закрывающие теги.

Предложения

Ответы [ 5 ]

1 голос
/ 11 ноября 2009

Вы можете скопировать XML в новую структуру.

public static XElement Minify(XElement element) {
    return new XElement(element.Name, element.Attributes(),
        element.Nodes().Select(node => {
            if (node is XElement)
                return Minify((XElement)node);
            return node;
        })
    );
}

Вот еще одно решение, но без LINQ http://social.msdn.microsoft.com/Forums/en-US/xmlandnetfx/thread/e1e881db-6547-42c4-b379-df5885f779be

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load("input.xml");
foreach (XmlElement el in 
   doc.SelectNodes("descendant::*[not(*) and not(normalize-space())]"))
{
  el.IsEmpty = true;
}
doc.Save("output.xml");
0 голосов
/ 16 апреля 2013

Попробуйте WebMarkupMin XML Minifier с опцией "Свернуть теги без содержимого":

    const string xmlInput = "<row RoleId=\"4\" RoleName=\"Administrator\"></row>\n" +
        "<row RoleId=\"5\" RoleName=\"Contributor\"></row>\n" +
        "<row RoleId=\"6\" RoleName=\"Editor\"></row>"
        ;

    var xmlMinifier = new XmlMinifier(
        new XmlMinificationSettings{ CollapseTagsWithoutContent = true });

    MarkupMinificationResult result = xmlMinifier.Minify(xmlInput);

    Console.WriteLine("Minified content:{0}{0}{1}",
        Environment.NewLine, result.MinifiedContent);
0 голосов
/ 11 ноября 2009

Я не проверял это сам, но вы пытались поэкспериментировать со свойством XmlWriter XmlWriterSettings.OutputMethod ?

На следующей странице вы можете использовать опции:

http://msdn.microsoft.com/en-us/library/system.xml.xmloutputmethod.aspx

0 голосов
/ 11 ноября 2009

Посмотрите на свойство XmlElement IsEmpty .

0 голосов
/ 11 ноября 2009

Если вы используете LINQ to XML, вы можете позвонить XElement.RemoveNodes(), чтобы преобразовать его во вторую форму. Так что-то вроде этого:

var emptyTags = doc.Descendants().Where(x => !x.Nodes().Any()).ToList();

foreach (XElement tag in emptyTags)
{
    tag.RemoveNodes();
}

Затем сохраните документ обычным способом, и я думаю он будет делать то, что вы хотите ...

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