我正在尝试从保存函数生成的xml文件中提取数据。以下是数据序列化后xml的样子
<Data>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<Content><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> </Content>
</Data>
我可以读取&lt;&gt;之间的数据使用XElement对象的符号并使用Element(“Child”)提取它。例如,ParentID的值,但我不知道如何从Content标签中提取属性数据,例如读取Image的Tag属性的程序,这种情况Tag ='开始'。
有人可以协助我解决此事吗
答案 0 :(得分:1)
如果您遇到的问题是Content节点中的数据是格式错误的片段,那么这是一种提取,修复错误并获取数据的方法。
string asReadXml = @"<Data>
<ParentID>00000000-0000-0000-0000-000000000000</ParentID>
<Content><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> </Content>
</Data>";
var fragment = Regex.Match(asReadXml, @"(?:\<Content\>)(?<Xml>.+)(?:\</Content\>)", RegexOptions.ExplicitCapture).Groups["Xml"].Value;
var validFragment = Regex.Replace(Regex.Replace(fragment, "(<)", "<"), "(>)", ">");
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><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>" +
"</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数据。这样,您就可以将所有解析卸载到专用库中。