Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在元素名称中使用空格解析XML_C#_Xml_Xml Parsing - Fatal编程技术网

C# 在元素名称中使用空格解析XML

C# 在元素名称中使用空格解析XML,c#,xml,xml-parsing,C#,Xml,Xml Parsing,所以我必须解析一个简单的XML文件(只有一个级别,没有属性,只有元素和值),但问题是XML中有(或者可能有)空格。我知道这是很糟糕(可能很糟糕)的做法,但我不是那个构建XML的人,它来自外部库 例如: 测试 测试 你好 现在我的策略是一次读取一个字符的XML(我将其作为字符串),然后在到达时保存每个元素的名称和值,但这似乎有点太复杂了 有没有更简单的方法XMLReader会抛出一个错误,因为它认为XML格式正确,因此它认为“live”是元素名,“key”是属性,所以它试图查找“=”并获得“>”

所以我必须解析一个简单的XML文件(只有一个级别,没有属性,只有元素和值),但问题是XML中有(或者可能有)空格。我知道这是很糟糕(可能很糟糕)的做法,但我不是那个构建XML的人,它来自外部库

例如:

测试
测试
你好
现在我的策略是一次读取一个字符的XML(我将其作为字符串),然后在到达时保存每个元素的名称和值,但这似乎有点太复杂了


有没有更简单的方法
XMLReader
会抛出一个错误,因为它认为XML格式正确,因此它认为“live”是元素名,“key”是属性,所以它试图查找“=”并获得“>”

由于它是一个平面结构,可能有助于:

    MatchCollection ms = Regex.Matches(xml, @"\<([\w ]+?)\>(.*?)\<\/\1\>");

    foreach (Match m in ms)
    {
        Trace.WriteLine(string.Format("{0} - {1}", m.Groups[1].Value, m.Groups[2].Value));
    }
MatchCollection ms=Regex.Matches(xml,@“\(.*?”);
foreach(匹配m,毫秒)
{
Trace.WriteLine(string.Format(“{0}-{1}”,m.Groups[1].Value,m.Groups[2].Value));
}

所以你会得到一个“键值”对的列表。跟踪仅用于检查结果

不幸的是,库返回的文本不是格式良好的XML,因此无法使用XML解析器对其进行解析。标签中的空格只是问题的一部分;还有其他问题,例如,缺少“root”标记

幸运的是,单级语言非常简单,可以与正则表达式匹配。基于正则表达式的“解析器”对于真正的XML来说是一个糟糕的选择,但这种语言不是真实的,所以您至少可以使用正则表达式作为一种解决方法:

Regex rx = new Regex("<([^>\n]*)>(.*?)</(\\1)>");
var m = rx.Match(text);
while (m.Success) {
    Console.WriteLine("{0}='{1}'", m.Groups[1], m.Groups[2]);
    m = m.NextMatch();
}

我个人会尝试删除或替换所有空格,然后加载xml。但这也可能很棘手。我会给管理这个库的人发一封措辞强硬的信。不幸的是,空格使输入不是格式良好的XML,这意味着没有标准的解析器会接受它;基本上,你是靠自己。这太糟糕了-试着说服你的第三方图书馆的作者来解决这个问题。如果它们仍然存在,他们应该理解为什么。您是否有一个包含所有可能有空格的标记的列表,或者该列表是动态的?为什么将其称为XML?这可不是那种事。如果您的数据供应商想要发明一种定制的非标准XML变体,那么需要有人为其编写解析器。这是很大的努力,我不明白为什么会有人想这么做。谢谢,这很有帮助
Regex rx = new Regex("<([^>\n]*)>(.*?)</(\\1)>");
var m = rx.Match(text);
while (m.Success) {
    Console.WriteLine("{0}='{1}'", m.Groups[1], m.Groups[2]);
    m = m.NextMatch();
}
live key='test'
not live='test'
Test='hello'