只访问父节点属性而没有子节点

时间:2016-03-29 09:40:00

标签: c# .net xml winforms nodes

我有一个XML文件,想要在新的XML文件中提取它的一些节点并保存它。 XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<files version="2.1.8" Dir="D:Test\Exm_2" modified="2016-03-18 23:14:58Z" user="Test" language="en">
    <file name="1">
        <file name="4">
           <file name="9">
           </file>
        </file> 
    </file>
    <file name="2">
    </file>
    <test name="3">
        <test name="5">
            <test name="7">
            </test>
        </test>
    </test>
</files>

我的目标是保存此XML文件的一些特殊节点(此处为测试节点)。我们的想法是保存随附的root属性。我的意思是如果我想在新文件中保存节点test我希望将root属性作为原始XML文件:

<?xml version="1.0" encoding="utf-8"?>
<files version="2.1.8" Dir="D:Test\Exm_2" modified="2016-03-18 23:14:58Z" user="Test" language="en"> 
    <tests>       
        <test name="3">
            <test name="5">
                <test name="7">
                </test>
            </test>
        </test>
    </tests>
</files>

但是我没能保存它的属性。我保存第二个XML文件的代码是

public void Creat_Steps(string xmlfile, string FileName)
{
    XElement doc = XElement.Load(xmlfile);
    var item = doc.XPathSelectElement("//test");
    XElement newDoc = new XElement("files", new XElement("tests", item));
    XElement Docc = new XElement("files", item);

    Docc.Save(FileName + ".xml");
}

但是此代码只创建名为files且没有任何属性的根节点。我必须在新的XML文件中使用该属性,然后没有它。有什么想法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

最简单的方法就是替换根元素的子节点:

var values = $("input[name^='card']").map(function (idx, ele) {
   return $(ele).val();
}).get();

请注意,此处不需要XPath :)另请注意,我使用的是var root = XElement.Load(xmlFile); root.ReplaceNodes(new XElement("tests", root.Elements("test"))); root.Save(FileName + ".xml"); 而不是Elements,否则每个Descendants元素将成为test的新直接子元素{1}},这不是你想要的。

我个人建议使用tests加载和保存文档,因为这清楚地表明了你的意图,顺便说一句。那时你要用

XDocument