Как загрузить файлы XML из файла - PullRequest
1 голос
/ 11 августа 2010

мой xml ниже:

<Demo>
    <ClientCompanyId CompanyId="1">
        <MyMenu>
            <module MenuType="0" ModID="Mod1" ModuleID="1" Perm="False" Text="Basic Settings">
                <menu MID="1-1" MenuDescription="Mod" MenuType="0" ModuleID="1" ParentID="Mod1" Perm="False" Text="Forms">
                    <Leaf LeafNode="true" MID="1-3" MenuDescription="" MenuType="0" ModuleID="1" ModuleMenuID="1-3" ParentID="1" Perm="False" TargetUrl="" Text="LookUp"/>
                    <submenu MID="1-4" MenuDescription="" MenuType="0" ModuleID="1" ParentID="1" Perm="False" Text="Bank Branch">
                        <Leaf LeafNode="true" MID="1-5" MenuDescription="" MenuType="0" ModuleID="1" ModuleMenuID="1-5" ParentID="4" Perm="False" TargetUrl="" Text="BO Category"/>
                    </submenu>
                </menu>
                <menu MID="1-2" MenuDescription="Mod" MenuType="0" ModuleID="1" ParentID="Mod1" Perm="False" Text="Reports">
                    <Leaf LeafNode="true" MID="1-6" MenuDescription="" MenuType="0" ModuleID="1" ModuleMenuID="1-6" ParentID="2" Perm="False" TargetUrl="" Text="Cheque Type"/>
                    <Leaf LeafNode="true" MID="1-7" MenuDescription="" MenuType="0" ModuleID="1" ModuleMenuID="1-7" ParentID="2" Perm="False" TargetUrl="" Text="Stock Exchange"/>
                </menu>
            </module>
        </MyMenu>
    </ClientCompanyId>
</Demo>

мой синтаксис linq ниже:

 XDocument loaded = XDocument.Load(@"C:\Menu_Settings.xml");
 var q = from c in loaded.Descendants("module")
 where (int)c.Attribute("ModuleID") < 0
 select (string)c.Attribute("Text");

Из приведенного выше xml-файла iхочу получить значения атрибутов тега.

Text="Basic Settings" ModID="Mod1" ModuleID="1" MenuType="0" Perm="False"

Из приведенного выше xml я хочу получить все значения атрибутов тега.

Как получить значение из файла xml ?

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Ну, похоже, ты почти у цели:

XDocument loaded = XDocument.Load(@"C:\Menu_Settings.xml");

var q = from c in loaded.Descendants("module")
        where (int)c.Attribute("ModuleID") < 0
        select new
        {
             Text = (string) c.Attribute("Text"),
             ModID = (string) c.Attribute("ModID"),
             ModuleID = (int) c.Attribute("ModuleID"),
             MenuType = (int) c.Attribute("MenuType"),
             Perm = (bool) c.Attribute("Perm")
        };

Если это не поможет, пожалуйста, дайте больше подробностей.

0 голосов
/ 11 августа 2010

Или вы можете на последнем шаге привести XElement и использовать все, что может предложить XElement:

вместо var q:

IEnumerable<XElement> q =from c in loaded.Descendants("module") 
                    where (int)c.Attribute("ModuleID").Value < 0 
                    select c;

foreach(XElement e in q){
   string t = e.Attribute("Text").Value;
   // etc...
}

если вы знаете, что одна запись будет возвращена

XElement q = (from c in loaded.Descendants("module") 
                    where (int)c.Attribute("ModuleID").Value < 0 
                    select c).First(); // one of many options to return a single record

sring t = q.Attribute("Text").Value;
// etc...

UPDATE

для дальнейших запросов к вашему результату:

IEnumarble<XElement> menus = q.Elements("menu");

затем цикл foreach, вы можете использовать menuselement.Element("tag_name").Value, чтобы получить строковые значения узлов, или menuselement.Attribute("attr_name").Value, чтобы получить значения атрибутов, и вы можете дополнительно запросить с помощью menuslement.Find или menuselement.Where или menuselement.Select и параметров действительно безграничны ... вот где вы можете узнать больше: http://msdn.microsoft.com/en-us/library/bb387065.aspx

А вот MSDN как запросить xml с помощью linq: http://msdn.microsoft.com/en-us/library/bb943906.aspx

...