问题描述
我的计划是追加<图像> @ matchedFilePathToAnImageHere< /图片>
只有那些<项目>< /项目>
节点,其之间的&LT值;名称>< /名称>
标签,转换为小写时,替换为下划线空间等,将匹配在一个单独的文件夹中的实际图像文件名。
在code正确地匹配图像的大约95%的项目,但结束了&LT追加每个匹配的图像文件名;图片>< /图片&GT ;
来的第一<项目>< /项目方式>
的我怎么会追加每个<图像>< /图片>
到相应的<项目>< /项目&GT ;。
的每一个项目只需要一个图片
图片文件夹
name1.jpg
name_2.jpg
name3.jpg
...
名998.jpg
XML(解析之前)
<项目>
<项目>
<名称>&名1 LT; /名称>
<价格>&价格1 LT; /价格>
<描述>&说明1 LT; /描述>
< /项目>
<项目>
<名称>&名2 LT; /名称>
<价格>&Price2 LT; /价格>
<描述>&说明2 LT; /描述>
< /项目>
<项目>
<名称>&NAME3 LT; /名称>
<价格>&Price3 LT; /价格>
<描述> Description3< /描述>
< /项目>
< /项目>
XML(期望分析后的结果)
<项目>
<项目>
<名称>&NAME1 LT; /名称>
<价格>&价格1 LT; /价格>
<描述>&说明1 LT; /描述>
<图像> C:\\路径\\为\\ name1.jpg< /图片>
< /项目>
<项目>
<名称>&名2 LT; /名称>
<价格>&Price2 LT; /价格>
<描述>&说明2 LT; /描述>
<! - 匹配`name2`(命令行通知),所以跳过这里附加图像标签,但我在这里添加图像标签后用手,因为我发现,有一个形象没有图像文件名`name_2.jpg` - - >
< /项目>
<项目>
<名称>&NAME3 LT; /名称>
<价格>&Price3 LT; /价格>
<描述> Description3< /描述>
<图像> C:\\路径\\为\\ name3.jpg< /图片>
< /项目>
< /项目>
code
使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用的System.Xml;
使用System.Xml.Linq的;
使用System.IO;命名空间myXmlParser
{
类节目
{
静态无效的主要(字串[] args)
{
//加载XML
XmlDocument的DOC =新的XmlDocument();
doc.Load(@C:\\ items.xml);
//获取℃之间的值;名称>< /名称>对于每一个item元素
XmlNodeList中的节点= doc.SelectNodes(//项目/名称/文本()); //每次转换提取名称值小写
//替换下划线空间
//删除'符号
//有匹配图像文件名的几率较高
//,_The和_,一个取代似乎不工作(哦)
的for(int i = 0; I< nodes.Count;我++)
{ //做魔法!
字符串searchKeyword = nodes.Item(I).Value.Replace(,_)。替换(',)。替换(_中(字符串))。替换( 。_a,)ToLower将(); //Console.WriteLine(searchKeyword); //现在找我的文件名匹配searchKeyword减去扩展任何图像
字符串[] =文件路径Directory.GetFiles(@C:\\图片,searchKeyword +*,SearchOption.TopDirectoryOnly); //如果事情被发现/匹配然后附加<图像> @ pathToImageHere< /图片>到目前
// item节点,否则日志没有一个匹配的图像任何项目节点
//!没有正确添加!
如果(filePaths.Length大于0)
{
XmlDocumentFragment FRAG = doc.CreateDocumentFragment();
frag.InnerXml = @<图像>中+文件路径[0] + @< /图像>中;
doc.DocumentElement.FirstChild.AppendChild(FRAG);
}
其他
{
Console.WriteLine(没有图像被发现!{0},searchKeyword);
} //Console.WriteLine(filePaths[j]);
//的foreach(在文件路径字符串文件路径)
// {
//等等
//}
} //现在保存新解析的XML某处
doc.Save(items_with_images.xml); Console.ReadKey(); } //主
} //类
} //命名空间
doc.DocumentElement.FirstChild.AppendChild(破片);
为什么要追加到文档的第一个孩子。难道你不希望附加到当前节点?
nodes.Item(I).ParentNode.ParentNode.AppendChild(破片);
What I planned was to append <image>@matchedFilePathToAnImageHere</image>
only to those <item></item>
nodes whose values between <name></name>
tags, when converted to lower case, replaced spaces with underscores and etc, would match actual image file names in a separate folder.
The code properly matches about 95% of images to the items, but ends up appending every matched image file name with <image></image>
to the very first <item></item>
.
How would I append every <image></image>
to their appropriate <item></item>
? Every item needs only one image.
Images folder:
name1.jpg
name_2.jpg
name3.jpg
...
name 998.jpg
XML(before parsing):
<items>
<item>
<name>Name1</name>
<price>Price1</price>
<description>Description1</description>
</item>
<item>
<name>Name2</name>
<price>Price2</price>
<description>Description2</description>
</item>
<item>
<name>Name3</name>
<price>Price3</price>
<description>Description3</description>
</item>
</items>
XML(desired result after parsing):
<items>
<item>
<name>name1</name>
<price>Price1</price>
<description>Description1</description>
<image>C:\path\to\name1.jpg</image>
</item>
<item>
<name>Name2</name>
<price>Price2</price>
<description>Description2</description>
<!-- no image file name matched `name2`(command line notice), so skip appending image tags here BUT I add the image tag here later by hand, because I find out that there's an image `name_2.jpg` -->
</item>
<item>
<name>Name3</name>
<price>Price3</price>
<description>Description3</description>
<image>C:\path\to\name3.jpg</image>
</item>
</items>
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace myXmlParser
{
class Program
{
static void Main(string[] args)
{
// load the xml
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\items.xml");
// retrieve the values between <name></name> for the every item element
XmlNodeList nodes = doc.SelectNodes("//item/name/text()");
// convert every extracted name value to lower case
// replace spaces with underscores
// remove the ' symbols
// to have higher chance of matching images' file names
// ",_the" and "_,a" replaces don't seem to work( oh well )
for (int i = 0; i < nodes.Count; i++)
{
// do the magic!
string searchKeyword = nodes.Item(i).Value.Replace(" ", "_").Replace("'","").Replace(",_the",(string)"").Replace(",_a","").ToLower();
//Console.WriteLine(searchKeyword);
// Now find me any images whose filenames match the searchKeyword minus the extensions
string[] filePaths = Directory.GetFiles(@"C:\images", searchKeyword + "*", SearchOption.TopDirectoryOnly);
// if something was found/matched then append <image>@pathToImageHere</image> to the current
// item node, otherwise log any item nodes that didn't have a match to an image
// ! Doesn't APPEND properly !
if (filePaths.Length > 0)
{
XmlDocumentFragment frag = doc.CreateDocumentFragment();
frag.InnerXml = @"<image>" + filePaths[0] + @"</image>";
doc.DocumentElement.FirstChild.AppendChild(frag);
}
else
{
Console.WriteLine("NO IMAGE WAS FOUND!!! {0}", searchKeyword);
}
//Console.WriteLine(filePaths[j]);
//foreach (string filePath in filePaths)
//{
//blah
//}
}
// now save the new parsed xml somewhere
doc.Save("items_with_images.xml");
Console.ReadKey();
}// main
}// class
}// namespace
doc.DocumentElement.FirstChild.AppendChild(frag);
Why do you append to the first child of the document. Aren't you expected to append to the current node?
nodes.Item(i).ParentNode.ParentNode.AppendChild(frag);
这篇关于意想不到的结果,使用附加的XmlDocument和XmlDocumentFragment新的子节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!