Есть ли простой способ создать новый xmls из XML-файла, используя c # - PullRequest
0 голосов
/ 21 июля 2009

Например

<?xml version="1.0" encoding="UTF-8"?>
<!--just example, the actual element structure is rather complex -->
<components>
   <component name='a'/>
   <component name='b'/>
   <component name='c'/>
 </components>

Теперь я хочу создать три отдельных xml-файла, корневой элемент которых является компонентом, а имя файла соответствует их атрибуту name. Как мне этого добиться?

С уважением,

Ответы [ 2 ]

1 голос
/ 21 июля 2009

Используя LINQ to XML, что-то вроде

XElement rootElem = ... //load this however you happen to
foreach (var component in rootElem.Elements("component"))
    component.Save(your-XmlWriter-here); //you'll want a distinct writer per file

должно работать нормально; для вашего конкретного примера ...

string xml =@"
    <components>
       <component name='a'/>
       <component name='b'/>
       <component name='c'/>
    </components>
";
foreach (XElement component in XElement.Parse(xml).Elements() )
    component.Save(component.Attribute("name").Value + ".xml");

работает точно так, как указано. Тем не менее, я считаю хорошей практикой избегать работы с конкретными именами файлов, где это возможно, поскольку достаточно часто ваш XML может обрабатываться непосредственно позже в конвейере без необходимости промежуточного (подверженного ошибкам и медленного) сохранения файла. Например, на веб-сервере не очевидно, что у вас даже будут права на запись чего-либо, поэтому вы уменьшаете переносимость, заставляя использовать реальный файл.

0 голосов
/ 21 июля 2009

Вот, пожалуйста:

System.Xml.XmlDocument daddyDoc = new System.Xml.XmlDocument();
daddyDoc.LoadXml("<?xml version='1.0' encoding='UTF-8'?><components><component name='a'/><component name='b'/><component name='c'/></components>");
foreach (System.Xml.XmlNode sprogNode in daddyDoc.GetElementsByTagName("component"))
{
    System.Xml.XmlDocument sprogDoc = new System.Xml.XmlDocument();
    sprogDoc.CreateXmlDeclaration("1.0", "UTF-8", null);
    sprogDoc.AppendChild(sprogDoc.CreateElement("component"));
    sprogDoc.Save(string.Format("C:\\{0}.xml", sprogNode.Attributes["name"].Value));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...