2016-10-04 77 views
0

我與以下內容的字符串變量給出:代替部分焦炭

<main> 
<Title title="Hello World" /> 
<Content content="bla bla bla... by <1% to ??? on other bla bla...." /> 
</main> 

這個字符串最終將傳遞給存儲過程的XQuery。

正如你所看到的,「內容」的內容包含字符「<」,這當我嘗試在存儲過程來分析的,它返回一個錯誤。

我的問題是如何將「<」轉換成& LT;(在這種情況下爲< 1%& lt; 1%)以有效的方式。

我想保留其他「<」原樣。

韓國社交協會

+1

這似乎不是一個有效的XML。 –

+1

''根本就不是有效的XML,因爲沒有匿名屬性。你的意思是' foo'而不是? – Dai

+0

你好,我已經更新了原始代碼...它應該是<內容=「bla bla bla ... <1%to ??? on other bla bla ....」/> – Trowa

回答

1

由於您更新了您的問題,指出您正在處理XML,但未編碼的值在屬性值中,而不是在#text節點中,因此它使它更簡單一些,只需使用類似方法提取屬性值即可回答,然後使用庫函數實現它,然後輸出。

請注意,CDATA僅適用於#text,而不適用於屬性。

String doc = 
@"<main> 
<Title title=""Hello World"" /> 
<Content content=""bla bla bla... by <1% to ??? on other bla bla...."" /> 
</main>"; 

Int32 contentOpenStart = doc.IndexOf("<Content"); 
Int32 contentAttribContentValueStart = doc.IndexOf("content=\"", contentOpenStart) + "content=\"".Length; 
Int32 contentAttibContentValueEnd = doc.IndexOf("\"", contentAttribContentValueStart); 

String attributeValueOld = doc.Substring(contentAttribContentValueStart, contentAttibContentValueEnd); 
String attributeValueNew = System.Net.WebUtility.HtmlEncode(attributeValueOld); 

String doc2 = String.Concat(
    doc.Substring(0, contentAttribContentValueStart); 
    attributeValueNew, 
    doc.Substring(contentAttibContentValueEnd); 
); 

doc2然後包含固定的屬性值。

注意,使用HtmlEncode執行實體的HTML編碼是不是在XML嚴格正確的,因爲一套XML實體比HTML的小很多 - 實際上,XML只關心&amp;&gt;&lt;&quot;&apos; ,所有其他值應作爲原始/本地字符在文檔中。

+0

您的建議解決方案的好主意,我設法通過輕微調整您的代碼來構建解決方案。 – Trowa

0

(這個答案是基於你在處理結構正確的XML,只是在#text節點未編碼的實體的假設 - 如果你輸入的數據確實像<Title="foo" />這個答案並不適用 - 這根本不是XML)

如果我正確理解您的問題,您在String實例中包含一個XML文檔,其中包含不正確地轉義/賦值的特殊字符,這會阻止您使用正常的XML解析器來讀取文檔。

如果您正在處理符合XML標準的系統,那麼您可以使用<![DATA[,然後不需要嘗試處理<Content>元素的內容,然後就會插入CDATA分隔符。

雖然人們經常說不能使用正則表達式來解析XML(因爲XML不是Regular Language),但您可以利用XML的語法規則來提取和識別標記。

所以,如果你有這樣的:

<Content someAttribute="someValue"> 
reduce sales by <1% in order to ensure that profit > loss 
</Content> 

然後,你可以這樣做:

String doc = @"<main><Title..."; 
Int32 contentOpenStart = doc.IndexOf("<Content"); 
Int32 contentOpenEnd = doc.IndexOf(">", contentOpenStart); 

Int32 contentCloseStart = doc.IndexOf("</Content>", contentOpenEnd); 

那麼這段代碼告訴我們<Content>元素的兩個標籤的尖括號的locatations,與我們可以插入CDATA分隔符:

String newDocument = String.Concat(
    doc.Substring(0, contentOpenEnd + 1), // "<main>...<Content...>" 
    "<![CDATA[", 
    doc.Substring(contentOpenEnd + 1, contentCloseStart), 
    "]]>", 
    doc.Substring(contentCloseStart) "</Content>..." 
); 

newDocument將會是這樣的:

<Content someAttribute="someValue"><![CDATA[ 
reduce sales by <1% in order to ensure that profit > loss 
]]></Content> 

...這是有效的XML。

+0

hi @戴,徵求意見。問題是該值在標籤的屬性中,而不在其內容中。所以,而不是:減少銷售<1%,以確保利潤>損失,我得到:損失「/>我怎樣才能相應地調整代碼?我們是否也可以使用CDATA屬性? – Trowa