노드 이름의 잘못된 문자로 XML을 구문 분석하는 방법은 무엇입니까?
-
21-08-2019 - |
문제
그래서 저는 XML을 구문 분석하려고합니다. 제작은 제 통제하에 있지 않습니다. 문제는 어떻게 든 다음과 같이 보이는 노드를 가지고 있다는 것입니다.
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />
Visual Studio와 .NET는 위에서 사용 된 '('and ')'문자가 완전히 유효하지 않다고 생각합니다. 불행히도이 파일을 처리해야합니다! XML Reader 클래스가 이러한 캐릭터를 보는 데 놀라지 않거나 동적으로 탈출하는 방법이 있습니까? 전체 파일에서 어떤 종류의 사전 처리를 할 수는 있지만 '('and ')'문자가 노드 내부에 유효한 방식으로 나타나면 모두를 제거하고 싶지 않습니다. ..
해결책
그것은 단순히 유효하지 않습니다. 사전 프로세싱은 아마도 Best-Bet, 아마도 Regex와 같은 것입니다.
string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");
편집 : 괄호 안에 "-"를 대체하기 위해 조금 더 복잡합니다.
string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
delegate(Match match) {
return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
+ match.Groups[3].Value;
});
다른 팁
구문 적으로 유효하지 않은 경우 XML이 아닙니다.
XML은 이것에 대해 매우 엄격합니다.
올바른 XML을 보내기 위해 보내는 신청서를받을 수 없다면 무엇이든 다운 스트림 프로세스는 이것을 봅니다 실패합니다, 앞으로도 당신의 것이 든 다른 앱이든.
전처리가 옵션이 아닌 경우 또 다른 영리한 메커니즘은 Stream
사용자 정의 스트림으로 구문 분석기에 전달되는 객체. 그 스트림은 찾을 수 있습니다 <
문자, 그리고 하나를 볼 때 깃발을 설정하십시오. a까지 >
캐릭터가 보이고, 먹을 수 있습니다 (
또는 )
캐릭터. 우리는 레거시 전송 메커니즘으로 XML 파일에 추가 된 NUL 및 ^Z 문자를 제거하기 위해 이와 같은 것을 사용했습니다. (유일한 Gotcha가있을 수 있습니다 <
속성 내부의 문자는 거기에서 탈출 할 필요가 없기 때문에 >
캐릭터는 그렇습니다.)