2

System.XMLを使用して、Packet Name="PacketOut"に記述されているUnityObjectの値を読み取るだけです。よろしくお願いします。これが切り取られたXMLです:

 <IOConfig>

    <Packet Name="PacketOut" RemoteAddress="10.0.2.250" RemotePort="2020" NetworkInterface="ETH0" >
      <Signal Type="float" Name="x_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="y_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="z_out"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="alpha_out"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="theta_out"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="phi_out"      Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>

      <Signal Type="float" Name="x_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="y_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="z_out1"        Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="alpha_out1"    Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="theta_out1"    Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>
      <Signal Type="float" Name="phi_out1"      Unit="m/s"      Routing=""       UnityObject="CraneSlewing" ></Signal>

      <Signal Type="float" Name="x_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="y_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="z_out2"        Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="alpha_out2"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="theta_out2"    Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      <Signal Type="float" Name="phi_out2"      Unit="m/s"      Routing=""        UnityObject="CraneBoom"    ></Signal>
      </Packet>


    <Packet Name="PacketIn" LocalPort="2021" NetworkInterface="ETH0">
      <Signal Type="float" Name="x_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="y_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="z_in"        Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="alpha_in"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="theta_in"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="phi_in"      Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>

    <Signal Type="float" Name="x_in1"      Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="y_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="z_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="alpha_in1"  Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="theta_in1"  Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
      <Signal Type="float" Name="phi_in1"    Unit="m/s"      Routing=""          UnityObject="CraneBoomCrash"></Signal>
  </Packet>

  </IOConfig>

以下のコードを切り取ってみましたが、残りのXMLでUnityObjectのすべての値が取得されます。

using UnityEngine;
using System.IO;
using System.Xml;
using System.Text; 
using System.Collections.Generic;
using System.Collections;

public class xmlreader : MonoBehaviour
{
    public static List<string> values; 
    public string gameObjects;

    public XmlReaderSettings settings;


    void Start ()
    {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreWhitespace = true;
            settings.IgnoreComments = true;
            values = new List<string>();
        using ( XmlReader reader = XmlReader.Create("D://Docs/Unity3D/cdp/UDPApplication/Components/UDPIOServer.xml", settings) ) {

        while ( reader.Read() ) {
                    if ( reader.NodeType == XmlNodeType.Element) {

                        if ( reader.HasAttributes ) {

                        if ( reader.GetAttribute("UnityObject") != null ) {
                            gameObjects = reader.GetAttribute("UnityObject");
                            values.Add(gameObjects);



                }
                                }
                            }


                            }
                        }



    }
                }
4

2 に答える 2

1

これは、非常に単純なXPath式で実行できます。

XmlDocument doc = new XmlDocument();
doc.Load("D://Docs/Unity3D/cdp/UDPApplication/Components/UDPIOServer.xml");

XmlNodeList nodes =
    doc.SelectNodes("IOConfig/Packet[@Name='PacketOut']/Signal/@UnityObject");

List<string> result = new List<string>();
foreach (XmlNode node in nodes)
{
    result.Add(node.Value);
}

resultList<string>ようになり{"CraneBoom", "CraneBoom", ...}ました。

このソリューションでは と のみを使用System.Collections.GenericSystem.Xmlます。

于 2012-11-20T14:48:25.947 に答える
0

xsd.exeVisual Studio に同梱されているツールです。

xml ファイルの名前を IOConfig.xml に変更したことに注意してください。

以下を試してください:

ファイルから xsd スキーマを推測し、IOConfig.xsd を生成します。

xsd.exe IOConfig.xml

旅に役立つ素敵な IOConfig.cs ファイルを生成します

xsd.exe IOConfig.xsd /classes

次に、オブジェクトを逆シリアル化して処理する必要があります。

    public void ReadIOConfig()
    {
        string fileName = @"C:\IOConfig.xml";
        XmlSerializer xs = new XmlSerializer(typeof(IOConfig));
        XmlReader reader = XmlReader.Create(fileName);
        IOConfig config = xs.Deserialize(reader) as IOConfig;
        var packetOut = (from configPacket in config.Items
                         where configPacket.Name == "PacketOut"
                         select configPacket).First();

        foreach (var signal in packetOut.Signal)
            Console.WriteLine(signal.UnityObject);

    }

生成されたファイルを使用:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.269
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

// 
// This source code was auto-generated by xsd, Version=4.0.30319.1.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class IOConfig
{

    private IOConfigPacket[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Packet", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public IOConfigPacket[] Items
    {
        get
        {
            return this.itemsField;
        }
        set
        {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class IOConfigPacket
{

    private IOConfigPacketSignal[] signalField;

    private string nameField;

    private string remoteAddressField;

    private string remotePortField;

    private string networkInterfaceField;

    private string localPortField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Signal", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public IOConfigPacketSignal[] Signal
    {
        get
        {
            return this.signalField;
        }
        set
        {
            this.signalField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string RemoteAddress
    {
        get
        {
            return this.remoteAddressField;
        }
        set
        {
            this.remoteAddressField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string RemotePort
    {
        get
        {
            return this.remotePortField;
        }
        set
        {
            this.remotePortField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string NetworkInterface
    {
        get
        {
            return this.networkInterfaceField;
        }
        set
        {
            this.networkInterfaceField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string LocalPort
    {
        get
        {
            return this.localPortField;
        }
        set
        {
            this.localPortField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class IOConfigPacketSignal
{

    private string typeField;

    private string nameField;

    private string unitField;

    private string routingField;

    private string unityObjectField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Type
    {
        get
        {
            return this.typeField;
        }
        set
        {
            this.typeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Name
    {
        get
        {
            return this.nameField;
        }
        set
        {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Unit
    {
        get
        {
            return this.unitField;
        }
        set
        {
            this.unitField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Routing
    {
        get
        {
            return this.routingField;
        }
        set
        {
            this.routingField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string UnityObject
    {
        get
        {
            return this.unityObjectField;
        }
        set
        {
            this.unityObjectField = value;
        }
    }
}
于 2012-11-20T14:44:53.807 に答える