如何使用属性过滤Xml文件?

时间:2014-05-20 08:44:03

标签: c# asp.net xml linq active-directory

嗨我想控制一个xml文件...为此我使用linq to xml。

private string GetGroup(string xml, string id) 
        {
            XDocument document;
            XElement element;

            try
            {
                document = XDocument.Load(xml);
                //element = document.Root.Elements("Permissiongroup").FirstOrDefault(e => e.Element("id").Value == id);

                element = document.Elements("Permissiongroup").FirstOrDefault(e => e.Element("id").Value == id);

                if (element != null)
                {
                    return element.Element("display").Value;
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception)
            {
                return null;
            }
            finally 
            {
                document = null;
                element = null;
            }

        }

这是我的xml:

<?xml version="1.0" encoding="iso-8859-1"?>

<Permissiongroup>
  <Permission id="Hessen" display="KV-IT" />
  <Permission id="Berlin" display="DBG_Update" />
</Permissiongroup>

例如我想要的方法是..

string group = GetGroup(xmlpath, "Hessen");

小组是&#34; KV-IT&#34;

3 个答案:

答案 0 :(得分:2)

您目前拥有的内容存在一些问题 - 您错过了查询的权限并查找了元素而不是属性。以下工作,虽然我会将其拆分以检查元素是否存在(例如,确保存在Permission元素等),而不是依赖于错误处理。

// string group = GetGroup(xmlpath, "Hessen"); // returns KV-IT
// string group2 = GetGroup(xmlpath, "Berlin"); //DBG_Update

private string GetGroup(string xml, string id)
{
    XDocument document;
    XElement element;

    try
    {
        document = XDocument.Load(xml);

        element = document.Elements("Permissiongroup").Elements(("Permission")).FirstOrDefault(t => t.Attribute("id").Value == id);

        if (element != null)
        {
            return element.Attribute("display").Value;
        }
        else
        {
            return string.Empty;
        }
    }
    catch (Exception ex)
    {
        return null;
    }
    finally
    {
        document = null;
        element = null;
    }

}

答案 1 :(得分:1)

使用方法Attribute()而不是使用Element()来访问属性

private string GetGroup(string xml, string id) 
    {
        XDocument document;
        XElement element;

        try
        {
            document = XDocument.Load(xml);
            //element = document.Root.Elements("Permissiongroup").FirstOrDefault(e => e.Attribute("id").Value == id);

            element = document.Elements("Permissiongroup").FirstOrDefault(e => e.Attribute("id").Value == id);

            if (element != null)
            {
                return element.Attribute("display").Value;
            }
            else
            {
                return string.Empty;
            }
        }
        catch (Exception)
        {
            return null;
        }
        finally 
        {
            document = null;
            element = null;
        }

    }

答案 2 :(得分:1)

您可以编写xml结构,然后使用可以将xml转换为xsd                                                                             http://www.freeformatter.com/xsd-generator.html#ad-output

一旦有了xsd文件,就可以下载jaxb,它会将xsd文件转换为POJO文件

然后在你的程序中,你可以像这样访问xml的属性

  JAXBContext jc2 = JAXBContext.newInstance(someclassname.class);
  File xml2 = new File(xml_File);
  Unmarshaller unmarshaller2 = jc2.createUnmarshaller();
  someclassnameObject= (someclassname) unmarshaller2.unmarshal(xml2);

并且可以使用object来使用它的属性,例如someclassnameObject.attribute