2012-11-12 34 views
2

我的XML的一部分是這樣的:如何避免XML中的屬性重複c#?

<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> 

所需的輸出:輸出,輸出1,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()); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+5

這不是xml –

+4

Xml只是存儲...如果你不想重複,*不要添加重複*!數據來自哪裏? –

+0

我只是想避免使用符號< > –

回答

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... 
        } 
       } 
      } 
     } 
    } 
} 
1

遍歷所有的值,並將其添加一個包含檢查列表/詞典/陣列/不管。之後,打印收集的值。

Here's解決方案:

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]); 
     } 
    } 
+0

我將此代碼添加到我的,它不起作用:(可以請你 –

+0

只需使用Konstantin Vasilcov的剪裁 –

0

另一種方法是定義你編程方法需要分開的時候無論XML的XML架構XML Schema確保XML的合規性。

XML Schema描述XML文檔的結構。

看一看以下參考:

  1. XML Schema Tutorial
  2. XSD Attributes
3

你可以使用LINQ to XML您的任務:

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); 
+0

實際上我不能在Unity3D中使用LINQ :( –

+0

@TTTTaker比使用Max Pressburger的答案中描述的方法足夠了,使用'XmlReader' 。只需使用一個緩衝區集合來存儲不同的'UnityName's。 – horgh

+0

@TTTaker,請參閱我的另一個答案,在代碼中闡明這種方法 – horgh