3

XML 文字列を解析する VB.Net コードがあります。

XML 文字列は TCP サードパーティ ストリームから取得されるため、取得したデータを取得して処理する必要があります。問題は、要素データの 1 つに &、$、< などの特殊文字が含まれていることがあるため、「XMLDoc.LoadXml(XML)」を実行すると失敗することです。XMLDoc は「Dim XMLDoc As XmlDocument =」として構成されていることに注意してください。新しい XmlDocument()".

これについてGoogleの回答を試みましたが、解決策を見つけるのに本当に苦労しています。RegEX を見てきましたが、これにはいくつかの制限があることに気付きました。または私はそれを十分に理解していません笑。

ここで役立つ場合は、ストリーミングした XLM の例を示します (情報として、メッセージ タグは SMS メッセージから取得されます):- (それが役立つ場合、エラーが発生する唯一のビットは (そして、チェック)<Message>O&N</Message>セクションなので、この場合、メッセージには &) が付いています。

<IncomingMessage><DeviceSendTime>19/02/2013 14:00:50</DeviceSendTime>
 <Sender>0000111111</Sender>
 <Status>New</Status>
 <Transport>Sms</Transport>
 <Id>-1</Id>
 <Message>O&N</Message>
 <Timestamp>19/02/2013 14:00:50</Timestamp>
 <ReadTimestamp>19/02/2013 14:00:50</ReadTimestamp>
</IncomingMessage>
4

2 に答える 2

3

特に要素内を調べてMessageおり、要素内にネストされた要素がないと仮定した場合Message

Dim url = "put url here"
Dim s As String

Dim characterMappings = New Dictionary(Of String, String) From {
    {"&", "&amp;"},
    {"<", "&lt;"},
    {">", "&gt;"},
    {"""", "&quot;"}
}

Using client As New WebClient
    s = client.DownloadString(url)
End Using
s = Regex.Replace(s,
    "(?:<Message>).*?(" & String.Join("|", characterMappings.Keys) & ").*?(?:</Message>)",
    Function(match) characterMappings(match.Groups(1).Value)
)
Dim x = XDocument.Parse(s)

$XMLの問題ではないはずですが、問題がある場合は、辞書に追加できます。

の使用はここWebClientから来ます。

更新しました

正規表現では特別な意味があるため$、単に辞書に追加することはできません。\正規表現パターンでエスケープする必要があります。これを行う最も簡単な方法は、キーを辞書に結合する代わりに、パターンを手動で記述することです。

s = Regex.Replace(s,
    "(?:<Message>).*?(&|<|>|\$).*?(?:</Message>)",
    Function(match) characterMappings(match.Groups(1).Value)
)

また、正規表現を操作する場合はExpressoを強くお勧めします。

于 2013-02-19T20:27:10.477 に答える
1

XML が無効であるため、XML ではありません。XML を生成するコードを修正するか (正しいアプローチ)、これがテキスト ファイルであると偽って、構造化されていないテキストの解析に関するすべての問題を楽しんでください。

質問で述べたように、<Message>O&N</Message>有効な XML ではありません。このような「XML」の最も可能性の高い理由は、適切な XML 操作メソッドを使用する代わりに、文字列連結を使用して構築することです。難解な言語を使用しない限り、実際に使用されるすべての言語には XML 作成用の組み込みまたはライブラリ サポートがあるため、XML を正しく作成するのはそれほど難しくありません。

于 2013-02-19T18:14:37.877 に答える