2013-12-17 88 views
0

我對XML的格式字符串,(這不是格式良好的XML!),我想獲得的字段和值分割字段/值未格式化

<MYXML 
address="rua sao carlos, 128" telefone= "1000-222" service="xxxxxx" source="xxxxxxx" username="aaaaaaa" password="122222" nome="asasas" sobrenome="aass" email="[email protected]" pais="SS" telefone="4002-" /> 

我會喜歡獲取split中的參數和值。

我試試這個:

xml.ToString().Replace(" =" , "=").Replace("= " , "=").Replace(" = " , "=").Split(new char[]{' '});   

但不起作用完美becase的例如屬性 '地址' 中的兩個項目

分裂
{string[29]} 
[0]: "<signature" 
[1]: "aaa=\"xxxx\"" 
[2]: "sss=\"xxxx\"" 
[3]: "ssss=\"xxx\"" 
[4]: "username=\"xxx\"" 
[5]: "password=\"xxxx\"" 
[6]: "nome=\"xxxx\"" 
[7]: "sobrenome=\"xxx\"" 
[8]: "email=\"[email protected]\"" 
[9]: "pais=\"BR\"" 
[10]: "endereco=\"Rua" 
[11]: "Sao" 
[12]: "Carlos," 
[13]: "128\"" 
[14]: "cidade=\"Sao" 
[15]: "Paulo\"" 

的錯誤是

[10]: "endereco=\"Rua" 
[11]: "Sao" 
[12]: "Carlos,"  

當我想要的是

[10]: "endereco=\"Rua Sao Carlos , 128" 
+0

這是正確的,因爲地址是由''分隔的,你想分割爲'' –

+0

你能重命名重複屬性,然後解析爲格式良好的XML嗎? –

+0

不是因爲這個XML在某些時候是不同的。並沒有一個XML模式,(一個schemma) –

回答

1

的正則表達式將會對這項工作,你用不好的XML工作。

 Regex regex = new Regex("\\s\\w+=\"(\\w|\\s|,|=|@|-|\\.)+\""); 
     MatchCollection matches = regex.Matches(searchText); 
     foreach (var match in matches) 
     { 
      //your code here 
     } 

經過您的示例字符串和匹配測試如預期。 希望這有助於!

+1

鑑於他正在使用垃圾xml,這是最好的選擇。 +1希望他能得到好的xml壽,然後XDocument是要走的路。 – paqogomez

+0

謝謝,我同意最好的結果將是有良好的XML。 – AFrieze

+0

嗨,你的解決方案是完美的工作!我同意這是最好的方法!非常感謝你! –

0

我建議你使用xPath或Linq來解析這個xml。你使用的方式不是一個好方法,這就是爲什麼你最終會犯錯誤的。「Rua Sao Carlo」包含三個由單個空格隔開的單詞;因此,當您嘗試將其拆分爲單個空格時,它也會拆分地址

+0

有多個'telefone'屬性,因此它不是格式良好的XML。 –

+0

我知道這不是完整的。因爲這是一個STRING,沒有一個「schema xml」。 –

0

如前所述,您已經非常糟糕地形成了XML。如果要修復它,通過重命名或刪除電話屬性,可以按如下方式分解XML:

這是處理XML的正確方法,但是如果您無法控制獲取正確的XML和必須工作瓦特/垃圾,我會建議由@AFrieze的正則表達式答案。

var xmlString = @"<MYXML address=""rua sao carlos, 128"" service=""xxxxxx"" source=""xxxxxxx"" username=""aaaaaaa"" password=""122222"" nome=""asasas"" sobrenome=""aass"" email=""[email protected]"" pais=""SS"" telefone=""4002-"" />"; 
var xml = XDocument.Parse(xmlString); 
var values = xml.Descendants("MYXML").SelectMany(x => x.Attributes()).ToArray(); 

foreach (var value in values) 
{ 
    Console.WriteLine(value); 
} 
Console.Read(); 

這將返回:

address="rua sao carlos, 128" 
service="xxxxxx" 
source="xxxxxxx" 
username="aaaaaaa" 
password="122222" 
nome="asasas" 
sobrenome="aass" 
email="[email protected]" 
pais="SS" 
telefone="4002-" 
0

嘗試this超載Split。它將允許您使用一個字符串作爲分離器令牌,即'" '(即引用和空格)。這將拆分爲名稱和屬性對。然後取出生成的數組,並在=(等於)上重新分割以獲得所需的對,然後按照您的要求進行操作。希望這讓你朝着正確的方向