分割字段/值来自xml STRING未格式化

时间:2013-12-17 22:48:32

标签: c# split

我有一个XML格式的字符串,(这不是格式良好的XML!)我希望获得字段和值

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

我想在分割中获得参数和值。

我试试这个:

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

但不是完美的工作因为例如属性'地址'分为两个项目

{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=\"xxx.xxx@xxx.com.br\""
[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"

4 个答案:

答案 0 :(得分:1)

当您处理格式错误的xml时,正则表达式将适用于此。

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

使用您的示例字符串进行测试,匹配符合预期。 希望这有帮助!

答案 1 :(得分:0)

我建议你使用xPath或Linq来解析这个xml。你使用的方式不是一个好方法,这就是你最终出错的原因。“Rua Sao Carlo”包含三个单词空格分隔的单词;因此,当您尝试使用单个空格拆分它时,它也会拆分地址

答案 2 :(得分:0)

如前所述,您的XML格式很糟糕。如果您要修复它,通过重命名或删除电话属性,您可以像这样分解XML:

这是处理XML的正确方法,如果你无法控制获取正确的xml并且必须使用w / junk,我建议@AFrieze使用正则表达式答案。

var xmlString = @"<MYXML address=""rua sao carlos, 128"" service=""xxxxxx"" source=""xxxxxxx"" username=""aaaaaaa"" password=""122222"" nome=""asasas"" sobrenome=""aass"" email=""sao.aaaaa@aaaaa.com.br"" 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="sao.aaaaa@aaaaa.com.br"
pais="SS"
telefone="4002-"

答案 3 :(得分:0)

尝试Split的{​​{3}}重载。它允许您使用字符串作为拆分器令牌,即'" '(即引用和空格)。这将拆分为名称和属性对。然后获取结果数组,并在=(等于)上再次拆分以获得所需的对,然后按照您的意愿进行操作。希望这能让你朝着正确的方向前进