0

私は何かをしようとしていますが、それは非常に単純かもしれませんので、ご容赦ください.XMLファイルからC#コードの文字列に「DisplayName」を取得したいだけです。ここに私が持っているものがあります:

これは VS2005 の C#2.0 です

XML:

<MonitorScope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="System" xmlns="http://tempuri.org/XMLSchema.xsd">
    <PersonalSafety>    
<MonitorResponseRecord Enabled="false" DisplayName="ValveFailureAtCentralPosition">
<ExpressionMonitor>
<postAlarm>
<AlarmName>Valve_Position_Fault</AlarmName>
<Parameter1> Sensor Position = {X}</Parameter1>
<Parameter2> Sensor Position = {X}</Parameter2>
<Parameter3> Sensor Position = {X}</Parameter3>
</postAlarm>
</ExpressionMonitor>
</MonitorResponseRecord>
<MonitorResponseRecord ...  ... ...>
... ...
... ... and so on about 1600 times.

私のC#コードでは、次のことを試みましたが、役に立ちませんでした:C#:

public class AlarmRecord
{
    /// <remarks/>
    public string PmAlarm;

    /// <remarks/>
    public string Parameter1;

    /// <remarks/>
    public string Parameter2;

    /// <remarks/>
    public string Parameter3;

    /// <remarks/>
    public string DisplayName;
}

    protected void OnPostAlarm(PostAlarm postAlarm)
    {
        try 
        {
            AlarmRecord alarmRecord = new AlarmRecord(); 
            alarmRecord.PmAlarm    = postAlarm.AlarmName;
            alarmRecord.Parameter1 = postAlarm.Parameter1;
            alarmRecord.Parameter2 = postAlarm.Parameter2;
            alarmRecord.Parameter3 = postAlarm.Parameter3;
            
            string fileName = "UMSM.009.8Root.xml";
            string fullPath;
            fullPath = Path.GetFullPath(fileName);

            XmlTextReader reader = new XmlTextReader(new StringReader(fullPath));
            System.Xml.XPath.XPathDocument docNav = new System.Xml.XPath.XPathDocument(reader);

            System.Xml.XPath.XPathNavigator Q = docNav.CreateNavigator();
            System.Xml.XPath.XPathExpression EXE = Q.Compile("MonitorResponseRecord/@DisplayName");
            alarmRecord.DisplayName = Convert.ToString(Q.Evaluate(EXE));
             alarms.Enqueue( alarmRecord ); 
        }
        catch (Exception e)
        {
            Log.Write(e);
            OnUnknownResponse(postAlarm);
        }
    }

基本的に私の現在の問題は、デバッグ中に気付いた問題が「リーダー」が初期化されている行にあるということです...プログラムは通常、ここで例外をスローします

4

2 に答える 2

1

XmlReader を使用できます。

    protected void OnPostAlarm(PostAlarm postAlarm) 
    {
       AlarmRecord record = null;
       List<AlarmRecord> recordList = new List<AlarmRecord>();

        using(XmlReader reader = XmlReader.Create("Xml/bin/UMSM.009.8Root.xml"))
        {

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    switch (reader.Name)
                    {
                        case "MonitorResponseRecord":
                            record = new AlarmRecord();
                            recordList.Add(record);
                            reader.MoveToAttribute("DisplayName");
                            record.DisplayName = reader.Value;
                            break;

                        case "AlarmName":
                            record.PmAlarm = reader.ReadString();
                            break;

                        case "Parameter1":
                            record.Parameter1 = reader.ReadString();
                            break;

                        case "Parameter2":
                            record.Parameter2 = reader.ReadString();
                            break;

                        case "Parameter3":
                            record.Parameter3 = reader.ReadString();
                            break;
                    }
                }
            }
        }
于 2012-06-05T21:10:08.220 に答える
0

.NET 2.0 で XPathNavigator と XPath クエリを使用することをお勧めします。属性の読み取り (例の DisplayName など) は、XPath クエリで @ を使用して行われます。

ここにまともな例があります。XPathExpression ビットは必要ありませんが、nav.Evaluate を呼び出して、文字列 XPath クエリを直接提供することができます。

XML の例 (名前空間属性を削除する必要がありました):

<MonitorScope>
<PersonalSafety>    
    <MonitorResponseRecord Enabled="false" DisplayName="ValveFailureAtCentralPosition">
        <ExpressionMonitor>
            <postAlarm>
                <AlarmName>Valve_Position_Fault</AlarmName>
                <Parameter1> Sensor Position = {X}</Parameter1>
                <Parameter2> Sensor Position = {X}</Parameter2>
                <Parameter3> Sensor Position = {X}</Parameter3>
            </postAlarm>
        </ExpressionMonitor>
    </MonitorResponseRecord>
</PersonalSafety>

XPath を使用したコード例:

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xml);

        XPathNavigator nav = doc.CreateNavigator();
        XPathNodeIterator nodeList = nav.Select("//MonitorScope/PersonalSafety/MonitorResponseRecord");

        if (nodeList.Count != 0) {
            foreach (XPathNavigator node in nodeList) {
                // node queries are relative to MonitorResponseRecord node
                string displayName = node.SelectSingleNode("./@DisplayName").Value;

                string alarmName = node.SelectSingleNode("ExpressionMonitor/postAlarm/AlarmName").Value;
                string param1 = node.SelectSingleNode("ExpressionMonitor/postAlarm/Parameter1").Value;
                string param2 = node.SelectSingleNode("ExpressionMonitor/postAlarm/Parameter2").Value;
                string param3 = node.SelectSingleNode("ExpressionMonitor/postAlarm/Parameter3").Value;

                // do something with values
            }
        }
于 2012-06-05T20:35:53.783 に答える