【问题标题】:Extracting data from the properties of an xml file从 xml 文件的属性中提取数据
【发布时间】:2014-02-23 14:52:27
【问题描述】:

我正在尝试从保存函数生成的 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>

我可以使用 XElement 对象读取 符号之间的数据并使用 Element("Child").Value 例如 ParentID 提取它的值,但我不知道如何从 Content 标签中提取属性数据,例如作为程序读取 Image 的 Tag 属性,在本例中 Tag='Start'。

谁能帮我解决这个问题

【问题讨论】:

  • CDATA 部分中的内容数据是您的示例未向我们展示的吗?
  • 该文件不包含CDATA标签,这是xml文件的一般布局,&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;Root&gt; &lt;Items&gt; &lt;Data&gt; &lt;ParentID&gt;00000000-0000-0000-0000-000000000000&lt;/ParentID&gt; &lt;Content&gt;&amp;lt;ContentControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&amp;gt; &amp;lt;Grid&amp;gt;&amp;lt;Image Source=".//Resources/Images/start.png" Tag="Start" ToolTip="Start" IsHitTestVisible="False" /&amp;gt;&amp;lt;/Grid&amp;gt;&amp;lt;/ContentControl&amp;gt; &lt;/Content&gt; &lt;/Data&gt; &lt;Data&gt; ......... &lt;/Data&gt; ....... &lt;/Items&gt; &lt;/Root&gt;

标签: c# xml wpf


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,XDocument 的使用对我有用。我使用命名空间的 XElement 方法,但我不断为命名空间获取 null,并且从那时起更多的问题开始级联。
  • 如果我需要从具有特定名称或标签的文本框中提取文本,例如 Name = "num1" 或 Tag = "num1",它与图像所在的位置相同,什么编辑我是否必须搜索该特定名称以提取文本框中写入的值?
  • @Daniel 可以更改 where 子句以获取特定节点。如果有特定数据,则需要枚举属性,直到根据需要找到目标节点。您可能想发布一个新问题,因为现在您拥有有效的 Xml,现在您面临的是 xml linq-to-Xml 情况。
【解决方案2】:
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; // 

【讨论】:

  • 嗨,我收到“对象引用未设置为对象的实例。”在Object img = data.Element(ns + "Grid").Element(ns + "Image").Attribute("Tag").Value; 行。你能澄清一下你上面的答案吗?
  • 你能发布你试图解析的 XML 数据吗? (抱歉我来晚了)
【解决方案3】:

假设element是一个代表&lt;Content&gt;元素的XElement对象(你已经有办法得到它了),你可以通过如下操作来获取Tag元素的Tag属性值:

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");
}

我们在寻找它的属性之前检查image 是否为空。这样,如果有任何没有&lt;Image&gt; 元素的&lt;Content&gt; 元素,您将不会遇到异常)。在这种情况下,tag 变量将只包含空字符串。

&lt;Content&gt; 具有&lt;Image&gt; 元素位于不同路径(不在&lt;Grid&gt; 元素下)时,这也可以处理。

【讨论】:

  • 你应该为ns获取一个字符串吗?我不断得到一个十六进制数。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多