我正在尝试通过属性值选择xml节点。
我可以通过深入子节点来导航节点。我可以通过某种方式完全选择任何节点。
这是我用来测试的示例XML文件。
ftp push
这是我的示例代码
<svg version="1.1" archibusversion="24.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="1284.03 1666.86 8172 3392">
<g id="viewer">
<g id="mirror" transform="scale(1, 1)" stroke-width="0.05%">
<g id="background" fill="none"/>
<g id="annotations" fill="none" />
<g id="text" font-family="Arial" font-size="1.3" font-weight="normal" text-style="normal" text-anchor="middle" dominant-baseline="alphabetical" fill="#000000" xml:space="preserve" />
</g>
</g>
</svg>
我希望能够从svg文件中检索节点。该节点将有许多我需要处理的孩子。
答案 0 :(得分:0)
这是一种使用LINQ
来做到这一点的方法。
public bool GetAllElementsByAttributeValue(XElement startingNode, Relationship findAmong, string attName, string attValue, out IEnumerable<XElement> matchingNodes, out string msg)
{
bool ret = true;
msg = "SUCCESS";
matchingNodes = null;
try
{
switch (findAmong)
{
case Relationship.Descendants:
matchingNodes = from items in startingNode.Descendants()
where items.Attribute(attName) != null && items.Attribute(attName).Value == attValue
select items;
break;
case Relationship.Ancestors:
matchingNodes = from items in startingNode.Ancestors()
where items.Attribute(attName) != null && items.Attribute(attName).Value == attValue
select items;
break;
case Relationship.Siblings:
matchingNodes = from items in startingNode.Parent.Descendants()
where items.Attribute(attName) != null && items.Attribute(attName).Value == attValue
select items;
break;
}
}
catch (Exception ex)
{
msg = ex.Message;
ret = false;
}
return ret;
}
编辑:
Relationship
是我定义的enum
,用于区分后代,祖先和同级元素。
public enum Relationship
{
Ancestors = 0,
Siblings = 1,
Descendants = 2
}
用法:
static void Main()
{
var path = @"data.xml";
XDocument xdoc = XDocument.Load(path);
GetAllElementsByAttributeValue(xdoc.Root, Relationship.Descendants, "id", "background", out IEnumerable<XElement> nodes, out string msg);
Console.ReadLine();
}