2013-07-29 3 views
3

노드 이름에 공백 (깨진 XML 수정) 교체 :나는 그런 깨진 XML이

<root> 
    <Abc Dfg Xyz>data data data</Abc Dfg Xyz> 
    <Kmn fsd>data data</Kmn fsd> 
    <Aa bb/> 
</root>  

내가 XML 형식을 해결하기 위해 노드 이름에 밑줄과 공백을 대체 할 수있는 방법을, 그러나 Regex.Replace를 사용하여 데이터 중 (안) ? 사전에

<root> 
    <Abc_Dfg_Xyz>data data data</Abc_Dfg_Xyz> 
    <Kmn_fsd>data data</Kmn_fsd> 
    <Aa_bb/> 
</root> 

감사 :

나는 문서 같은 종류가 필요합니다.

+1

적 정규식 XML을 구문 분석에 대한 [이 답변] (http://stackoverflow.com/a/1732454/643085) 읽어? 실제로 HTML에 관한 것이지만, 귀하의 경우에도 동일하게 적용됩니다. –

+0

결론은 다음과 같습니다.하지 마십시오. – aevitas

+4

어떻게 깨진 XML로 끝났습니까? 아마도 XML을 생성하는 소스를 수정하는 것이 깨진 XML을 수정하는 것이 더 쉽습니다. – fcuesta

답변

3

데이터를 이해하지 않는 한 XML 정규 표현식 을 구문 분석하지 않는 것이 좋습니다. 일부 제한된 경우에 매우 도움이 될 수 있다고 저는 주장합니다. @HighCore, this answer to the same question 참조.

세계에서 가능한 모든 입력을 이해하려고 시도하지 않았습니다. — 우리는 특정 경우에 작동하는 것을 만들기 위해 노력하고 있습니다. 따라서 입력 한 데이터가에 < 또는 >이 아닌 경우 노드 이름 만 사용하면 정규식을 사용할 수 있습니다.

C#에서, 그래서 같은 MatchEvaluator를 사용

class MyReplacer { 
    public string ReplaceSpaces(Match m) 
    { 
     return m.Value.Replace(" ", "_"); 
    } 

void replacingMethod() { 

    ... 

    Regex re = new Regex("<.*>"); 

    MyReplacer r = new MyReplacer(); 
    // Assign the replace method to the MatchEvaluator delegate. 
    MatchEvaluator myEvaluator = new MatchEvaluator(r.ReplaceSpaces); 

    // Replace matched characters using the delegate method. 
    sInput = re.Replace(sInput, myEvaluator); 
} 
+0

+1 - 대부분의 시나리오에서 XML과 HTML을 Regex로 파싱해서는 안됩니다. 그러나 나는이 사건이 정규 표현식 (OP가 모든 정보를 준다고 가정)을 사용하여 보증 할만큼 구체적이라는 것에 동의한다. OP의 경우 문자열은 더 이상 XML이 아니며 단지 XML처럼 보입니다. – keyboardP

+0

고마워요, 나중에 다시 시험해 보겠습니다. – Pavel

+0

이것은 저에게 잘 돌아갑니다. – Pavel