2015-08-21 2 views
0

Мне нужно динамически создавать 'n' количество XElements внутри XDocument с использованием цикла и в зависимости от количества файлов, найденных в каталоге.Динамическое создание XElements внутри XDocument с использованием цикла

Мой WIP код голые кости проект, возможно, немного времени, чтобы вставить здесь, так что я добавил его в pastie.org - here

Вы увидите, что между строк 73-91, что у меня есть цикл Еогеасп, который ищет в каталог & - это подкаталоги и определяет пути всех файлов, содержащихся внутри. Я знаю, что это на его собственной работе, как я использовал:

int x = filePaths.Length;

и выход x соответствует количеству файлов в данной директории.

Основная часть кода работает и создает HTML-файл, я требую, но я также нужно, чтобы динамически создавать «п» XElements между линией 215, где я поставил:

/// **** NEED TO INSERT LOOP HERE TO DYNAMICALLY CREATE NUMBER OF ELEMENTS DEPENDING ON NUMBER OF FILES IN DIRECTORY ****

просто перед открытием тега <TR> & строки 280 сразу после закрытия тега <TR>, поэтому каждый файл, найденный в указанном каталоге, будет иметь свою собственную строку <TABLE>.

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

Первоначально я думал, что это будет так просто, как просто поместить петлю в коде в строке 215, но делать это вызывает многочисленные ошибки, такие как отсутствие:

  • ;
  • }

и т.д ...

Теперь я полностью застрял.

Я пытаюсь подражать в C# пакетный файл, я сделал некоторое время назад, что использует WMIC, который работает отлично, но ограничен & Я хотел бы добавить еще несколько функций, это где C# входит.

Пакетный файл использует цикл, как я пытаюсь здесь, без каких-либо проблем.

Вот цикл из пакетного файла WMIC:

(FOR /f "delims=" %%a IN ('dir /b /a-d /s /n "C:\Users\1CM69\Pics & Vids\Archives\Family\2002"') DO (
FOR /f "tokens=1-3*" %%x IN ('dir /a-d /tc "%%~a"^|findstr "^[0-9]"') DO (
    for /f %%c in ("%%~ta") do (
ECHO ^<TR^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<a href="%%a" target="_new"^>^<img src="%%a" width="100px" border="0"^>^</a^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="left" valign="middle"^>^<B^>%%~nxa^</B^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<B^>%%~c^</B^>^</TD^>^<td style="border-width: 1px;padding: 10px;border-style: inset;border-color: gray;background-color: white;" align="center" valign="middle"^>^<B^>%%x^</B^>^</TD^>^</TR^> >> 2002.html)))) 

я нашел Create XML with XDocument with a variable number of XElements using for loop будет искать вокруг & первоначально надежд и хотя я получить его динамически создавать «п» число XElements на основе количества файлов, переменная DateTaken показала только значение последнего файла в каталоге, поэтому у меня был <TABLE> с 68 строками <TR>, в случае с тестовым каталогом, который я использую, и все они содержали значения, полученные из окончательного файла что петля найдена.

Любая помощь была бы любезно оценена.

Привет ..,

ответ

1

Не использовать цикл, использовать выражение LINQ from .. select .. например,

from file in filePaths 
select new XElement("tr", 
    new XElement("td", 
    new XElement("a", new XAttribute("href", file), new XAttribute("target", "_new"), new XElement("img", new XAttribute("src", file), new XAttribute("width", "100"))), 
    new XElement("td", file), 
    new XElement("td", GetDate(file)) 
)) 

Чтобы извлечь дату, напишите метод, который инкапсулирует ваш код, например.

string GetDate(string path) { 

try 
             { 

             Bitmap MyPhoto = new Bitmap(file); 
             const int IDDateTimeOriginal = 36867; 
             PropertyItem TakenDate = MyPhoto.GetPropertyItem(IDDateTimeOriginal); 
             Encoding ascii = Encoding.ASCII; 
             return ascii.GetString(TakenDate.Value, 0, TakenDate.Len - 1); 
             } 


             catch //(ArgumentException) if the property doesn't exists 
             { 
              return "MISSING ENTRY"; 
             } 
} 
+0

Привет, изначально это казалось простой логический ответ и сделал вид работы. Он создал правильное количество строк на основе количества файлов, но опять же, только значения из последнего файла в каталоге заполняли каждую из строк в таблице. Я немного потерял здесь ... – 1cm69

+0

Можете ли вы показать нам HTML-строку примерной таблицы, которую вы хотите создать для образца файла в переменной 'filePaths'? Я боюсь, что образец WMIC не то, что я понимаю. –

+0

Ссылка на сокращенную версию выведенного '

'. У меня есть раздел заголовка '
', чтобы добавить ясность. Я знаю, что мой код еще не справился с заполнением столбца THUMBNAIL или столбца FILENAME '
', но извлечение этих данных из переменной 'filePaths' должно быть легким благодаря решению этой проблемы 1-го. Вы можете видеть, что столбец DATE TAKEN заполняется полем DateTimeOriginal из определенных EXIF-данных изображений, это должно быть сделано для всех изображений внутри каталога по итерации. [link] (http://pastie.org/private/d3wuh87zpyrqvrfvscdhia) – 1cm69

0

Если вы используете XElements они предназначены для работы с Linq так попробовать что-то вроде этого:

var filePaths = GetFiles(@"C:\SomeDir"); 
var xml = new XElement("tr", 
    filePaths.Select(fp => new XElement("td", fp.FullName))); 
+0

Привет, спасибо за ответ, но я точно не знаю, в какой момент в моем коде мне нужно вставить это. – 1cm69

+0

При размещении его вокруг точки, где мне нужен новый '

' Я получаю много ошибок, которые начинаются с 'var', недоступных в этом контексте, и запрашивает') 'after')' & '; 'на всем протяжении место, но никогда не кажется счастливым. – 1cm69

+0

Извините, новичок в Stack Overflow и забыл добавлять имя комментатора при ответе, так что: @ mant101 – 1cm69

 Смежные вопросы

  • Нет связанных вопросов^_^