2016-01-23 87 views
2

我想用Linq来解析存储在一个字符串中的XML片段。下面是XML:用包含尖括号的值解析XML,使用Linq

<rule name="U.S. Financial: PCI"> 
    <keyValues> 
    <keyValue key="id" value="3421c776-c95f-4ed2-915b-a684b97ae06b" /> 
    <keyValue key="minCount" value="1" /> 
    </keyValues> 
</rule> 

当我试图解析XML,我从<rule>元素的name属性的空格得到一个错误。我的解析代码如下:

XDocument doc = XDocument.Parse("<wrapper>" + xml + "</wrapper>", LoadOptions.PreserveWhitespace); 

但是,如果没有LoadOption,我会得到相同的错误。确切的错误是:

在System.Xml.dll中发生未处理的类型为'System.Xml.XmlException'的异常。附加信息:'美国'是一个意外的标记。期待空白。第1行,第24位。

如何使用Linq解析包含空白的属性,以及为什么我必须将xml与“包装器”元素一起包围才能使其工作?

编辑:进一步调查后,我认为错误实际上是由LINQ的发现引起一些它不知道如何为<rule>元素的结束标记之前解析。嵌套在<rule>元素中的是其他包含redacted值的元素,其格式中包含尖括号(但不是XML元素)。当被移除时,XML通常解析并且不再需要<wrapper>元素。

这些编辑值在我工作的XML中非常常见。如果我不能解析它们的XML,我该如何系统地替换/删除它们(我不需要它们)?编辑值在XML中看起来像这样:

<argument> 
<value> 
    <PII:H101(n5tSfjvfgkgVvZ2scBE9fdv2ui7O4A74R0OvGkR208Y=)>@gmail.com</value> 
</argument> 
+0

如果它被存储为一个字符串,试着用单引号替换所有的双引号(”到“)。我已经测试过它没有“包装”,它工作正常 –

+1

@WesH我也不能重现该问题,请参阅演示:https://dotnetfiddle.net/w1rWdJ – har07

+0

我挖了一点,并相信我找到了根本原因:进一步下来的redacted值包含尖括号,这似乎是导致错误的原因。我不确定如何删除这些值,但是如果我不能解析XML,我会更新qu选择和标题匹配。 –

回答

0

以下代码已经过测试并且正常工作。 如果存储为字符串,则问题可能在双引号中。

如果您的问题仍然存在,您必须向我们提供有关如何将此XML拉到字符串的更多信息。

string xml = "<rule name='U.S. Financial: PCI'> <keyValues> <keyValue key='id' value='3421c776-c95f-4ed2-915b-a684b97ae06b' /> <keyValue key='minCount' value='1' /> </keyValues></rule>"; 
XDocument doc = XDocument.Parse(xml); 
0

为了使输入的字符串可读我使用这种格式

string xml = 
       "<rule name=\"U.S. Financial: PCI\">" + 
        "<keyValues>" + 
        "<keyValue key=\"id\" value=\"3421c776-c95f-4ed2-915b-a684b97ae06b\" />" + 
        "<keyValue key=\"minCount\" value=\"1\" />" + 
        "</keyValues>" + 
       "</rule>";