所有,我是Linq to XML的新手,并且根据供应商规定的以下格式,从包含嵌套目录名称的List<string>
开始,询问如何生成XML。 - 请帮忙。感谢
供应商格式:
<eccu>
<match:recursive-dirs value="store" >
<match:recursive-dirs value="images" >
<revalidate>now</revalidate>
</match:recursive-dirs>
</match:recursive-dirs>
</eccu>
这是我的代码。但是,您可以看到它无法生成格式正确的结果。:
// NOTE - textBox1.Text = 'http://www.someurl.com/dir1/di2/images'
var dirs = (new Uri(textBox1.Text)).Segments.Select(dir => dir.Replace("/", String.Empty)).Where( dir => !String.IsNullOrWhiteSpace(dir)).ToList();
var x = new XDocument(new XDeclaration("1.0", null, null), new XElement("eccu", from s in dirs select new XElement("recursive-dirs", new XAttribute("value", s)), new XElement("revalidate", "now")));
这会产生:
<eccu>
<recursive-dirs value="dir1" />
<recursive-dirs value="dir2" />
<recursive-dirs value="images" />
<revalidate>now</revalidate>
</eccu>
答案 0 :(得分:1)
您的XML稍微不正确,因为它需要定义名称空间“匹配”。 以下代码将生成具有正确定义的命名空间属性的XML
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
new XElement(aw + "Child", "content")
);
产生
<aw:Root xmlns:aw="http://www.adventure-works.com"><aw:Child>content</aw:Child></aw:Root>
(摘自http://msdn.microsoft.com/en-us/library/system.xml.linq.xnamespace.xmlns.aspx) 您需要相应地调整代码。
答案 1 :(得分:0)
这样的事情应该以硬编码方式进行,假设match:recursive-dirs
是有效的xml(我不知道)。由于您正在讨论列表字符串,因此我需要查看它们的格式以处理LINQ语句。
XElement xml = new XElement("eccu",
new XElement("match:recursive-dirs",
new XAttribute("value", "store"),
new XElement("match:recursive-dirs",
new XAttribute("value", "images"),
new XElement("revalidate", "now")
)
)
)
);
根据评论进行修改
它不是很漂亮,但是
string text = "http://www.someurl.com/dir1/di2/images";
var dirs = (new Uri( text )).Segments
.Select( dir => dir.Replace( "/", String.Empty ) )
.Where( dir => !String.IsNullOrWhiteSpace( dir ) )
.ToList( );
var x = new XDocument(
new XDeclaration( "1.0", null, null ),
new XElement( "eccu" ) );
var eccu = x.Elements( ).First( );
XElement current = eccu;
foreach( var dir in dirs )
{
XElement newXElement = new XElement( "recursive-dirs",
new XAttribute( "value", dir ) );
current.Add( newXElement );
current = newXElement;
}
current.Add( new XElement( "revalidate", "now" ) );
Console.Out.WriteLine( x.ToString());
产生
<eccu>
<recursive-dirs value="dir1">
<recursive-dirs value="di2">
<recursive-dirs value="images">
<revalidate>now</revalidate>
</recursive-dirs>
</recursive-dirs>
</recursive-dirs>
</eccu>