2

私のXMLの一部は次のようになります。

<IOConfig>
  <Packet Name="PacketOut" RemoteAddress="10.0.2.223" RemotePort="2020" NetworkInterface="ETH0">
    <Signal Type="float" Name="x_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="y_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="z_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="alpha_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="theta_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="phi_out" Unit="m/s" Routing="" UnityObject="CraneBoom" UnityName="Out" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="x_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="y_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="z_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="alpha_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="theta_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="phi_out1" Unit="m/s" Routing="" UnityObject="CraneSlewing" UnityName="Out1" NetworkConvert="1"></Signal>
  </Packet>
  <Packet Name="PacketIn" LocalPort="2021" NetworkInterface="ETH0">
    <Signal Type="float" Name="x_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="y_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="z_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="alpha_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="theta_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
    <Signal Type="float" Name="phi_in" Unit="m/s" Routing="" UnityObject="CraneBoomCrash" UnityName="collider1" NetworkConvert="1"></Signal>
  </Packet>
</IOConfig>

必要な出力は、Out、Out1、collider1です。

つまり、UnityNameの重複する値は出力されません。これはできますか?

UnityNameの重複する値を読み取るコードを切り取った:

public class XMLStringReader : MonoBehaviour
{
    public string slectedItem;
    private bool editing = false;

    public string signalsa;
    public XmlReaderSettings settings;

    void OnGUI ()
    {
        if ( GUILayout.Button(slectedItem))
        {
            editing = true;
        }

        XmlReaderSettings settings = new XmlReaderSettings();
        settings.IgnoreWhitespace = true;
        settings.IgnoreComments = true;

        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("UnityName") != null ) 
                        {
                            signalsa = reader.GetAttribute("UnityName");
                            string [] signalsCDP = {signalsa};

                            if (editing)
                            {
                                for(int i =0; i < signalsCDP.Length; i++) 
                                {
                                    if (GUILayout.Button(signalsCDP[i]))
                                    {
                                        slectedItem = signalsCDP[i];
                                        editing = false;
                                        print(signalsCDP[i].ToString());
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
4

4 に答える 4

3

タスクにLINQtoXMLを使用できます。

XElement x = XElement.Load("File containing your xml");
var list = x.Descendants("Signal")
            .Where(d => d.HasAttributes && d.Attribute("UnityName") != null)
            .Select(d => d.Attribute("UnityName").Value)
            .Distinct();
foreach (string s in list)
    Console.WriteLine(s);
于 2012-11-12T11:32:44.833 に答える
1

すべての値を繰り返し処理し、リスト/辞書/配列/その他に包含チェックを付けて追加します。その後、収集した値を印刷します。

解決策は次のとおりです。

    internal static void PrintAttributeValues(XDocument scr)
    {
        List<string> values = new List<string>();
        foreach (XElement elem in scr.Descendants("Signal"))
        {
            if (!values.Contains(elem.Attribute("UnityName").Value))
            {
                values.Add(elem.Attribute("UnityName").Value);
            }
        }

        for (int j = 0; j < values.Count; j++)
        {
            Console.WriteLine(values[j]);
        }
    }
于 2012-11-12T11:27:05.470 に答える
0

もう1つの方法は、プログラムによるアプローチとは別に、必要なXMLのXMLスキーマを定義することです。XMLスキーマは、XMLのコンプライアンスを保証します。

XMLスキーマは、XMLドキュメントの構造を記述します。

次の参考資料をご覧ください。

  1. XMLスキーマチュートリアル
  2. XSD属性
于 2012-11-12T11:29:06.963 に答える
0

個別の値を含むコレクションを作成するだけです。次に、次の属性値がすでにそのコレクションにあるかどうかを確認します。そうでない場合は、それをコレクションに追加して、必要なことをすべて実行します。

List<string> values = new List<string>();

using (XmlReader reader = XmlReader.Create("your path", settings)) 
{
    while (reader.Read()) 
    {
        if (reader.NodeType == XmlNodeType.Element) 
        {
            if (reader.HasAttributes) 
            {
                if (reader.GetAttribute("UnityName") != null) 
                {
                    signalsa = reader.GetAttribute("UnityName");
                    if (!values.Contains(signalsa))
                    {
                        values.Add(signalsa);
                        //rest of your code goes here...
                    }
                }
            }
        }
    }
}
于 2012-11-12T12:24:46.517 に答える