2010-08-26 40 views
0

好的,我必须在C#(C Sharp)中执行以下操作,我是C Sharp编程的新手。在两个单独的文件中选择正确和不正确的XML节点

我得到了以下(见下文)XML文件。我需要选择在单独的.txt文件中使用XPath所有coreect节点,以及在单独的.txt文件中使用所有不正确的节点。

正确的节点需要满足的XPath下列条件:

 
ResourceCatalog/ Resource 
ResourceCatalog/ResourceGroup/Resource 
ResourceCatalog ........... ResourceGroup/Resource 

这是原始的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
<ResourceCatalog> 
    <Resource name ="Res1"></Resource> 
    <Resource> 
    <Name>Res3</Name> 
    </Resource> 
    <Service> 
    <Resource name ="Res2"></Resource> 
    <ResourceGroup name="Group2"> 
     <Resource name ="Res4"></Resource> 
     <Resource> 
     <Name>Res6</Name> 
     </Resource> 
    </ResourceGroup> 
    </Service> 
    <ResourceGroup name="Group1"> 
    <ResourceGroup name="Group12"> 
     <Service> 
     <Resource name ="Res8"></Resource> 
     </Service> 
     <Resource name ="Res5"></Resource> 
     <Resource> 
     <Name>Res7</Name> 
     </Resource> 
    </ResourceGroup> 
    <Resource name ="Res9"></Resource> 
    </ResourceGroup> 
</ResourceCatalog> 

回答

0

我知道这个问题是旧的,但我不愿看到的因此,我遇到的问题无法解答,因为它可能会在未来受益 - 您可以使用类似以下的XPath:

//Resource 

这将选择名称为的XML文档中的所有节点,其中资源似乎与您的问题中列出的条件相符。下面是一个非最优,非通用的方法来解决这个问题(因为它需要手动生成的XPath的倒数),而是将工作:

private static void SortNodes(string xml) 
{ 
    const string correctXPath = @"//Resource"; 
    const string incorrectXPath = @"//*[not(contains(name(), 'Resource'))]"; 

    var document = new XmlDocument(); 
    document.LoadXml(xml); 

    var correctNodes = document.SelectNodes(correctXPath); 
    var incorrectNodes = document.SelectNodes(incorrectXPath); 

    foreach (var node in correctNodes) 
    { 
     // Put into 'correct' txt file 
    } 

    foreach (var node in incorrectNodes) 
    { 
     // Put into 'incorrect' txt file 
    } 
} 

如果您的XML文件比较大,你也可以最好使用XmlTextReader,而不是将整个文档加载到XmlDocument结构中。

但是,如果我要自己解决这个问题,我会使用XSLT,因为您要做的就是将XML转换为另一种文本格式。我不知道要使用XSLT,所以你需要对此做更多的研究。网上有很多例子,这是一个相当简单的场景。