繁体   English   中英

使用循环在XDocument内部动态创建XElement

[英]Dynamically creating XElements inside XDocument using a loop

我需要能够使用循环并根据目录中找到的文件数在XDocument内动态创建'n'个XElement。

我的WIP裸露项目代码可能需要很长的时间才能粘贴到这里,因此我将其添加到pastie.org- 这里

您将看到在第73-91行之间,我有一个foreach循环,该循环搜索目录及其子目录,并找到其中包含的所有文件的路径。 我知道这是我自己使用的作品:

int x = filePaths.Length;

x的输出与给定目录中的文件数匹配。

代码的大部分内容也可以按我的要求工作并创建HTML文件,但我还需要它来动态地在我放置的第215行之间创建“ n”个XElement:

/// **** 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))))

我发现使用for循环使用XDocument创建具有可变数量XElements的XDocument创建XML会搜索&最初是有希望的,尽管我确实能够根据文件数量动态创建n个XElements,但变量DateTaken仅显示了目录中最后一个文件的值,因此对于我正在使用的测试目录,我有一个<TABLE>具有68行<TR> ,并且它们都包含从循环找到的最终文件中检索的值。

任何帮助将不胜感激。

问候..,

不要使用循环,请使用from .. select ..表达式中的LINQ

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

如果您使用的是XElement,则它们旨在与Linq配合使用,因此请尝试如下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM