Regex 매치를 기준으로 XML을 텍스트로 변경하는 방법 (문자 데이터)

StackOverflow https://stackoverflow.com/questions/1033289

  •  06-07-2019
  •  | 
  •  

문제

XML 파일의 텍스트 내용 (문자 데이터)을 일련의 Regex와 일치시키고 일치에 따라 XML을 변경하려고합니다. 예시:

 <text>
 <para>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
 </para>
 </text>

예를 들어 다음과 같은 텍스트와 일치하고 싶습니다.

\bdolor.\b

각 경기마다 예를 들어 태그와 일치하는 태그 나 유사한 일치를 둘러싸고 싶습니다.

<text>
<para>Lorem ipsum <bold>dolor<bold/> sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et <bold>dolore<bold/> magna aliqua.
</para>
</text>

한 가지 더 합병증은 내가 일치시키고 싶은 텍스트 (문자 데이터)가 여러 태그에 걸쳐있을 수 있다는 것입니다.

텍스트의 일치하는 부분을 선택한 다음 일치/선택한 텍스트의 형식을 변경하는 검색을 수행하는 경우 Word 프로세서 앱이해야 할 일과 매우 유사하다고 생각합니다.

Java (실제로 Clojure)를 사용하여이 작업을 수행하고 있으며 XML 문서를 조작하기 위해 JAXB를 사용하려고합니다.

위에서 어떻게해야합니까?

도움이 되었습니까?

해결책

편집하다:

좋아, 이제 나는 이것이 태그를 가로 질러 갈 수 있다는 것을 이해한다는 것을 이해 하셨기 때문에 여기서 어려움을 이해한다고 생각합니다.

내가 여기서 생각할 수있는 유일한 알고리즘은 XML 트리를 걸어 다니는 것입니다. 텍스트 부분을 일치하는 부분을 읽는 것입니다. 여러 노드에서 문자 별로이 일치하는 캐릭터를 수행해야합니다. 물론 어려움은 그 과정에서 나무를 munge하지 않는 것입니다 ...

내가하는 방법은 다음과 같습니다.

XML 트리로 걸어 갈 AA 워커를 만듭니다. 문자열 일치의 시작을 발견했다고 생각할 때마다 현재 상위 노드가 무엇이든 저장하십시오. STRING MATH의 끝을 찾을 때 (및 IF) 저장된 노드가 End Node의 부모와 동일한 지 확인하십시오. 그들이 동일하다면 나무를 수정하는 것이 안전합니다.

예제 문서 :

<doc>This is a an <b>example text I made up</b> on the spot! Nutty.</doc>

테스트 1 : 일치 : 예제 텍스트

워커는 예제에서 "e"를 찾을 때까지 걸어 다니며 상위 노드를 저장합니다 (<b> 노드) 그리고 그것이 끝날 때까지 계속 걸어 text 여전히 동일한 참조 노드에 있는지 확인하는 곳 <b> 그것은 그것이 일치하고 당신은 그것을 태그하거나 무엇이든 태그를 붙일 수 있습니다.

테스트 2 : 매치 : 예

워커가 먼저 맞았습니다 a 그리고 빨리 거절 한 다음 쳤다 an 그리고 저장하십시오 <doc> 마디. 그것은 계속해서 일치 할 것입니다 example 예제의 상위 노드가 <b> 그리고 아닙니다 <doc> 그 시점에서 일치가 실패하고 노드가 설치되지 않았습니다.

구현 1 :

직선 텍스트 만 일치하는 경우 Java (색소폰 또는 무언가)를 사용하는 간단한 매치자는 여기로가는 방법처럼 보입니다.

구현 2 :

일치하는 입력 자체 인 경우 매우 특별한 것이 필요합니다. 나는 여기서 확실히 작동 할 수있는 엔진이 없다는 것을 알고 있습니다. ~할 것 같다 할 수 있어야 할 수있는 것은 약간의 추악한 일을 작성하는 것입니다 ... 아마도 XML 트리를 작고 작은 노드 세트로 분해하여 각 레벨에서 전체 텍스트를 검색하는 일종의 재귀 워커 ...

매우 거친 (비 작업) 코드 :

def search(raw, regex):
    tree = parseXml(raw)
    text = getText(tree)
    if match(text, regex):


def searchXML(tree, regex):
    text = getFlatText(tree)
    if match(text, regex): # check if this text node might match
        textNodes = getTextNodes(tree)
        for (tn : textNodes): # check if its contained in a single text node
            if match(tn, regex):
                return tn
        xmlnodes = getXMLNodes(tree)
        for (xn : xmlnodes): # check if any of the children contain the text
            match = searchXML(xn, regex)
            if match
                return match
        return tree # matches some combination of text/nodes at this level
                    # but not at a sublevel
    else:
        return None # no match in this subtree

노드가 일치하는 위치를 알고 나면, 텍스트가 텍스트가 필요한 곳에있는 인덱스를 어떻게 알아낼 수 있는지 모르기 때문에 무엇을 할 수 있는지 잘 모르겠습니다. 당신이 수정할 수있는 regex가 있습니다 ...

다른 팁

"내가 일치시키고 싶은 텍스트는 여러 태그에 걸쳐있을 것"이라고 생각합니다.

 In <i>this</i> example, I want to match "In this example".

 In <i><b>this</b></i> example, I also want to match "In this example".

 And <i>in <b>this</b></i> example, it's clear I have to ignore case too.

당신이 말하는 변환이 잘 형성되지 않은 XML을 초래할 수 있기 때문에 이것은 특히 어려운 문제처럼 보입니다. 예를 들어 서브 스트링 주위에 태그를 넣으려고하면 다음과 같은 일이 발생합니다.

In this <i>example, putting tags around "in this example"</i> will break things.

<i>And in this</i> example, you have a similar problem.

잘 형성된 출력을 생성하려면 아마도 다음과 같은 모양이 필요할 것입니다.

<bold>In this <i>example</i><bold><i>, putting tags around "in this example"</i> will break things.

<i>And <bold>in this</bold></i><bold> example</bold>, you have a similar problem.

이론적으로, 당신이 일치하는 모든 캐릭터는 다른 요소에있을 수 있습니다.

Almost like <i><u>i</u><u>n</u> </i><u>th</u>is<i><i><u> ex</i>am</i>ple.</i>

기본적으로 두 가지 문제가 있으며 간단하지 않습니다.

  1. 텍스트 노드가 아닌 모든 것을 무시한 XML 스트림을 검색하고 스트림 내의 하위 문자열의 시작 및 종료 위치를 반환하십시오.

  2. XML 문서에 두 개의 임의의 인덱스가 주어지면 해당 인덱스간에 텍스트를 둘러싸는 요소를 작성하여 태그가 두 인덱스 중 하나이지만 두 가지 인덱스가 아닌 요소를 닫고 다시 열어주십시오.

XSLT와 정규 표현이 여기서 당신을 도울 수 없다는 것은 분명합니다. 나는 DOM을 사용하는 것이 여기서 당신을 도울 것이라고 생각하지 않습니다. 사실 나는 파서를 쓰지 않는 두 번째 문제에 대한 답이 있다고 생각하지 않습니다.

이것은 실제로 대답이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top