从xml文件的属性中提取数据

时间:2014-02-23 04:55:48

标签: c# xml wpf

我正在尝试从保存函数生成的xml文件中提取数据。以下是数据序列化后xml的样子

<Data> 
    <ParentID>00000000-0000-0000-0000-000000000000</ParentID> 
    <Content>&lt;ContentControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt; &lt;Grid&gt;&lt;Image Source=".//Resources/Images/start.png" Tag="Start" ToolTip="Start" IsHitTestVisible="False" /&gt;&lt;/Grid&gt;&lt;/ContentControl&gt; </Content> 
</Data>

我可以读取&lt;&gt;之间的数据使用XElement对象的符号并使用Element(“Child”)提取它。例如,ParentID的值,但我不知道如何从Content标签中提取属性数据,例如读取Image的Tag属性的程序,这种情况Tag ='开始'。

有人可以协助我解决此事吗

4 个答案:

答案 0 :(得分:1)

如果您遇到的问题是Content节点中的数据是格式错误的片段,那么这是一种提取,修复错误并获取数据的方法。

string asReadXml = @"<Data>
    <ParentID>00000000-0000-0000-0000-000000000000</ParentID>
    <Content>&lt;ContentControl xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""&gt; &lt;Grid&gt;&lt;Image Source="".//Resources/Images/start.png"" Tag=""Start"" ToolTip=""Start"" IsHitTestVisible=""False"" /&gt;&lt;/Grid&gt;&lt;/ContentControl&gt; </Content>
</Data>";


var fragment = Regex.Match(asReadXml, @"(?:\<Content\>)(?<Xml>.+)(?:\</Content\>)", RegexOptions.ExplicitCapture).Groups["Xml"].Value;

var validFragment = Regex.Replace(Regex.Replace(fragment, "(&lt;)", "<"), "(&gt;)", ">");

var xDoc = XDocument.Parse("<Root>" + validFragment + "</Root>");

/* XDoc looks like this:

<Root>
  <ContentControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Grid>
      <Image Source=".//Resources/Images/start.png" Tag="Start" ToolTip="Start" IsHitTestVisible="False" />
    </Grid>
  </ContentControl>
</Root>

*/

var Image =
   xDoc.Root
       .Descendants()
       .Where (p => p.Name.LocalName == "Image")
       .First ();

Console.WriteLine ( Image.Attribute("Tag").Value );

// Outputs
// Start

答案 1 :(得分:0)

var data = @"<Data>" + 
                          "<ParentID>00000000-0000-0000-0000-000000000000</ParentID>" + 
                          "<Content>&lt;ContentControl xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"&gt;"+ 
                    "&lt;Grid&gt;&lt;Image Source=\".//Resources/Images/start.png\" Tag=\"Start\" ToolTip=\"Start\" IsHitTestVisible=\"False\" /&gt;&lt;/Grid&gt;&lt;/ContentControl&gt;" + 
                    "</Content>" + 
                    "</Data>";

        var root = XElement.Parse(data);
        var contentValue = root.Element("Content").Value; 
        var contentXml = XElement.Parse(contentValue);
        var ns = contentXml.Name.Namespace; // retrieve the namespace 
        var imageTagValue = contentXml.Element(ns+"Grid").Element(ns+"Image").Attribute("Tag").Value; // 

答案 2 :(得分:0)

假设element是一个代表<Content>元素的XElement对象(您已经有办法获取它),您可以按照以下步骤获取Tag属性值{ {1}}元素:

Image

在查找属性之前,我们检查XElement element = ....; var content = XElement.Parse((string)element); var ns = content.Name.Namespace; var image = content.Descendants(ns + "Image").FirstOrDefault(); var tag = ""; if(image != null) { tag = (string)image.Attribute("Tag"); } 是否为null。这样,如果任何image元素没有<Content>元素,您将不会获得异常。在这种情况下,<Image>变量将只包含空字符串。

这也处理tag <Content>元素位于不同路径(不在<Image>元素下)的情况。

答案 3 :(得分:0)

就个人而言,我建议将整个内容作为字符串,然后使用http://htmlagilitypack.codeplex.com/库将其解析为html数据。这样,您就可以将所有解析卸载到专用库中。