需要帮助按属性选择xml节点

时间:2019-06-28 17:15:49

标签: c# xml

我正在尝试通过属性值选择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文件中检索节点。该节点将有许多我需要处理的孩子。

1 个答案:

答案 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();
}