Мое сообщение посвящено конкретной потребности, связанной с запросом ОП, но не конкретно тому, что спросил ОП. Мне нравятся и Regex, и рекурсия, когда они мне нужны, но в этом случае я думаю, что цель запроса OP состояла в том, чтобы научиться генерировать правильно отформатированный вывод XML, и то, что я предоставил ниже, делает именно это без тяжелого контекста. разработка исходного кода (зачем изобретать велосипед?) и поддерживается обратно в .NET 2.0 framework.
В своей работе я часто оказываю поддержку современным государственным системам. Эти системы часто все еще поддерживают до версии 2.0 только в системах развертывания - главным образом по соображениям безопасности. В платформе 2.0 отсутствуют некоторые изящные результаты более поздних выпусков .NET, особенно когда речь идет об объектах XML. Полностью утвержденный метод, приведенный ниже, был для меня ценным и экономил время, и я предлагаю его для невидимых товарищей-разработчиков, которые также обслуживают интересы правительства.
Кроме того, вы также можете использовать библиотеки LinqBridge для ограниченной поддержки Linq (пакет обновления .NET до версии 3.5 фактически самооценки до 2.0, поэтому LinqBridge был сконструирован для преодоления этого конкретного пробела (ограниченная поддержка запросов Linq при разработке до сборки 2.0, в то время как с использованием Visual Studio 2008). Однако обратите внимание, что LinqBridge в настоящее время не поддерживается пересылкой Visual Studio 2008.
Чтобы минимизировать размеры публикаций пакетов, а также оставаться совместимыми с организационными требованиями, в которых я предоставляю свои услуги, я избегаю использования ассоциативных не XML-библиотек (таких как Regex) для анализа XML и придерживаюсь стандартных объектов XML. В частности, старые объекты Xml * -prefix против более современных (и гораздо более гибких) объектов X * -prefix ...
Ниже я приведу многочисленные безопасные, простые и эффективные методы, которые генерируют форматированный XML из ассортимента стандартных объектов Xml * 2.0. Также обратите внимание, что рабочей лошадкой для этих функций на самом деле является класс XPathNavigator, а не его кузены.
Вот фрагмент кода C #, который вызывает примеры методов:
doc = new XmlDocument();
doc.Load(Input_FilePath);
sb = StringBuilderFromXmlDocument(doc);
Out(sb);
sb = StringBuilderFromXPathDocument(new XPathDocument(Input_FilePath));
Out(sb);
sb = StringBuilderFromXPathNavigator(new XPathDocument(Input_FilePath).CreateNavigator());
Out(sb);
ss = StringFromXmlDocument(doc);
Out(ss);
ss = StringFromXPathDocument(new XPathDocument(Input_FilePath));
Out(ss);
ss = StringFromXPathNavigator(new XPathDocument(Input_FilePath).CreateNavigator());
Out(ss);
и вот примеры методов, один из которых, вероятно, удовлетворит ваши потребности в форматировании XML:
public static StringBuilder StringBuilderFromXmlDocument(XmlDocument _xd)
{
XPathNavigator _xpn;
try
{
_xpn = _xd.CreateNavigator();
}
catch
{
_xd.LoadXml(DEFAULT_ERROR_TEXT);
_xpn = _xd.CreateNavigator();
}
return StringBuilderFromXPathNavigator(_xpn);
}
private static StringBuilder StringBuilderFromXPathDocument(XPathDocument _xpd)
{
StringBuilder returnVal = new StringBuilder();
XPathNavigator _xpn;
try
{
_xpn = _xpd.CreateNavigator();
returnVal.AppendLine(_xpn.OuterXml.Trim());
}
catch
{
returnVal = new StringBuilder()
.Append(DEFAULT_ERROR_TEXT);
}
return returnVal;
}
private static StringBuilder StringBuilderFromXPathNavigator(XPathNavigator _xpn)
{
StringBuilder returnVal = new StringBuilder();
try
{
returnVal.AppendLine(_xpn.OuterXml.Trim());
}
catch
{
returnVal = new StringBuilder()
.Append(DEFAULT_ERROR_TEXT);
}
return returnVal;
}
public static string StringFromXmlDocument(XmlDocument _xd)
{
XPathNavigator _xpn;
try
{
_xpn = _xd.CreateNavigator();
}
catch
{
_xd.LoadXml(DEFAULT_ERROR_TEXT);
_xpn = _xd.CreateNavigator();
}
return StringFromXPathNavigator(_xpn);
}
private static string StringFromXPathNavigator(XPathNavigator _xpn)
{
string returnVal;
try
{
returnVal = _xpn.OuterXml.Trim();
}
catch
{
returnVal = DEFAULT_ERROR_TEXT;
}
returnVal = _xpn.OuterXml.Trim();
return returnVal;
}
private static string StringFromXPathDocument(XPathDocument _xpd)
{
string returnVal;
XPathNavigator _xpn;
try
{
_xpn = _xpd.CreateNavigator();
returnVal = _xpn.OuterXml.Trim();
}
catch
{
returnVal = DEFAULT_ERROR_TEXT;
}
return returnVal;
}
наслаждаться. ^^
Обратите внимание, что в более поздних выпусках Framework и с использованием более новых объектов XElement вы можете использовать foreach () {} для узлов XElement и .ToString () каждый для автоматического правильного форматирования. Как я уже говорил выше, гораздо более изящно:).