2016-01-23 85 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>";