Чтение пользовательских элементов machine.config с помощью XmlDocument?

В файле machine.config есть элементы, написанные сторонним программным обеспечением, поэтому это выглядит так:

<configuration>
    <configSections>
    ...
    </configSections>

    ...

    <Custom>
        <Level1> ... 
        </Level1>

        <Level2> ... 
        </Level2>

        <Level3>
            <add key="key_text1" value="s1" />
            <add key="key_text2" value="s2" />
            <add key="key_text3" value="s3" />
        </Level3>
    </Custom>
</configuration>

Я хочу получить, например. значение ("s2") атрибута "value", где key="key_text2" из узла configuration/Custom/Level3. До сих пор я пытался открыть machine.config как XML и работать оттуда:

Configuration config = ConfigurationManager.OpenMachineConfiguration();
XmlDocument doc = new XmlDocument();
doc.LoadXml(config.FilePath);

однако я получаю XmlException «Данные на корневом уровне недействительны». Я также не знаю, как напрямую использовать методы класса конфигурации, чтобы сделать это. Любые идеи были бы хорошы.


person w128    schedule 24.01.2013    source источник


Ответы (2)


Используйте RuntimeEnvironment.SystemConfigurationFile, чтобы получить < em>machine.config расположение:

XmlDocument doc = new XmlDocument();
doc.Load(RuntimeEnvironment.SystemConfigurationFile);

Также почему бы не использовать Linq to Xml?

XDocument xdoc = XDocument.Load(RuntimeEnvironment.SystemConfigurationFile);
var element = xdoc.XPathSelectElement("//Custom/Level3/add[@value='s2']");
if (element != null)
    key = (string)element.Attribute("key");
person Sergey Berezovskiy    schedule 24.01.2013
comment
Спасибо, очень полезно. Оба ответа (животного и ваш) действительно сработали. Однако вместо приведенного выше мне пришлось использовать следующий код, чтобы заставить его работать: var query = "/configuration/Custom/Level3/add[@value='s2']"; var dbElement1 = xdoc.XPathSelectElement(query); string key = dbElement1.Attribute("value").Value; - person w128; 24.01.2013

Попробуйте использовать метод Load() вместо LoadXml()

doc.Load(config.FilePath);

Я также предлагаю вам взглянуть на XDocument вместо XmlDocument. LINQ будет действительно полезен при получении этого значения из файла конфигурации.

person Moriya    schedule 24.01.2013