簡體   English   中英

從XML名稱標記中刪除無效字符 - RegEx C#

[英]Removing Invalid Characters from XML Name Tag - RegEx C#

我有一個帶有xml數據的字符串,我從Web服務中提取。 數據很難看,並且在xml的Name標簽中有一些無效的字符。 例如,我可能會看到類似的東西:

<Author>Scott the Coder</Author><Address#>My address</Address#>

地址名稱字段中的#無效。 我正在尋找一個正則表達式,它將從名稱標簽中刪除所有無效字符但是將所有字符保留在xml的Value部分中。 換句話說,我想使用RegEx僅從開頭名稱標簽和結束名稱標簽中刪除字符。 其他一切都應該保持相同。

我還沒有所有無效的字符,但這會讓我開始:#{}&()

有可能做我想做的事嗎?

如果你的目的只是檢查Xml節點名稱的有效性,我建議你看一下XmlConvert類; 特別是VerifyNameVerifyNCName方法。

另請注意,使用該類,您可以使用EncodeNameEncodeLocalName方法接受任何文本作為節點名稱。

使用這些方法將比執行正則表達式更容易,更安全,更快捷。

您可以使用字符串替換來替換所有無效的字符。 通常,ascii控件字符會在XML讀取中產生問題。

避免使用此功能

     public static string CleanInvalidXmlChars( this string text)
    {
        // From xml spec valid chars:
        // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]    
        // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
        string re = @"[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]";
        return Regex.Replace(text, re, "");
    }


     xmlcontent = xmlcontent.CleanInvalidXmlChars();

這將清除正則表達式中指定的chracters。 我從這個網站得到這個

我有一個簡單的表單,有兩個文本區域和一個按鈕。 這似乎可以解決問題。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Regex r = new Regex(@"(?<=\<\w+)[#\{\}\(\)\&](?=\>)|(?<=\</\w+)[#\{\}\(\)\&](?=\>)");
            textBox2.Text = r.Replace(textBox1.Text, new MatchEvaluator(deleteMatch));
        }

        string deleteMatch(Match m) { return ""; }
    }
}

除非你真的只有一個要處理的文件,否則RegEx是一個有問題的方法。 痛苦,挫折,錯誤是你的未來......

要使用正則表達式,也有有用的這里 ,我在Perl已經使用。

您是否考慮過使用解析器?

兩個要考慮:

LINQ for XML

的XmlDocument

一旦解析,您可以重新保存麻煩的部分或只是以您的程序方式繼續。

嘗試這個:

s = Regex.Replace(s, @"[#{}&()]+(?=[^<>]*>)", "");

如果前瞻成功,則匹配后的下一個尖括號是右指向( > ),表示匹配發生在標記內。

當然,這假設文本格式合理,並且除了標簽中的角度之外不包含尖括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM