2011-09-01 82 views
1

我有这样的事情:如何搜索非结构化XML?

<group name="name1" ... > 
    <group name="name2" ... > 
    <image name="test1" ...> 
     <image name="test2" ...></image> 
     <group name="test98"...> 
     <image name="test67" ...> 
      <group name="test987"...> 
      <text name="asddd"...></text> 
      </group> 
     </image> 
     </group> 
     <group name="name22" ... > 
     <image name="test3" ...></image> 
     </group> 
    </image> 
    <image name="test4" ...> 
     <text name="asddd"...></text> 
    </image> 
    </group> 
</group> 

正如你所看到的是没有组织。也不是固定的,既不是节点名称也不是命令。 我不知道我要改变什么节点。 (除了组和图像,它可能还有更多)

我想要的是克隆第一个节点,然后搜索特定的属性来更改它们的值。其中一些有一个叫做“路径”的属性,其他只有一个叫做“左”。

你认为它可以更容易地将XML转换为文本?

回答

2

将XML载入到XmlDocument(或XDocument)将使您可以使用XPath查询,并且可以非常轻松地找到属性名称,如下例所示。

public class StackOverflow_7276178 
{ 
    const string XML = @"<group name='name1' > 
    <group name='name2' > 
    <image name='test1' > 
     <image name='test2' ></image> 
     <group name='test98'> 
     <image name='test67' > 
      <group name='test987'> 
      <text name='asddd' path='myPath'></text> 
      </group> 
     </image> 
     </group> 
     <group name='name22' > 
     <image name='test3' left='myLeft'></image> 
     </group> 
    </image> 
    <image name='test4'> 
     <text name='asddd'></text> 
    </image> 
    </group> 
</group>"; 

    public static void Test() 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.PreserveWhitespace = true; 
     doc.LoadXml(XML); 

     foreach (XmlAttribute pathAttr in doc.SelectNodes("//@path")) 
     { 
      pathAttr.Value = pathAttr.Value + "_modified"; 
     } 

     foreach (XmlAttribute leftAttr in doc.SelectNodes("//@left")) 
     { 
      leftAttr.Value = leftAttr.Value + "_modified"; 
     } 

     Console.WriteLine(doc.OuterXml); 
    } 
} 
+0

谢谢!我没有注意到我可以像这样使用xpath来过滤节点!抱歉打扰这么简单的事情..如果它不是太多,你能告诉我它是否有可能知道该属性的节点?我的意思是......在“foreach”里面。再一次..谢谢! – Pinheiro

+0

看看'OwnerElement'属性。 – carlosfigueira