AS3에서 XML 및 XMList가 관련이없는 (내재 현명한) 클래스 인 이유는 무엇입니까?

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

  •  05-07-2019
  •  | 
  •  

문제

XML AD XMLLIST를 모두 연장 객체에서 직접 객체를 직접 직접 사용하는 것은 AS3 코어 라이브러리의 설계 결함이라고 생각할 수 없습니다. XML을 확장하는 것은 XMLlist가 훨씬 더 깨끗한 시스템이 될 것입니다. 여기서 XML은 한 멤버 만있는 XMLLIST로 간주 되는가?

이것은 또한 XML 또는 XMLLIST를 반환 할 수있는 E4X 쿼리의 매우 성가신 관행을 피하기 때문에 캐스팅 오류가 발생할 수 있습니다.

XML과 Xmllist가 공통 유형으로 객체 만 갖도록 설계되었다고 생각하지 않는 이유가 있습니까?

도움이 되었습니까?

해결책 2

그래서이 질문에 대한 나의 간결한 대답은, 상속 트리를 보면 두 클래스를 보는 것 같습니다.xmllist, XML)는 관련이 없습니다.

그러나 ECMA 스크립트/AS3 문서를 살펴보면 ECMA 스크립트/AS3의 프로토 타입 시스템을 사용하는 것 같습니다.

언제 xmllist XML 노드처럼 취급 할 수있는 멤버가 하나뿐입니다. XML 클래스의 메소드와 필드는 AVM2에 의해 XMLlist 프로토 타입에 삽입 된 것으로 가정합니다.

다른 팁

그에 따르면 E4X의 ECMA 사양 (p22) 및 xmllist 문서, 그 xmllist 클래스는 다음의 방법을 포함합니다 XML 수업이지만 회원이 한 명있을 때만. 따라서 E4X 쿼리를 수행 할 때 결과는 항상 유형의 변수에 저장되어야합니다. xmllist.

미리, 이러한 물체의 이름으로 인해 나는 XML 객체는 XML 요소 데이터의 복잡한 트리를 나타 냈지만 투기(p12), 이것은 사실이 아닙니다. "각 유형의 각 값 XML XML 요소, 속성, 댓글, 처리 비계 또는 텍스트 노드를 나타냅니다. "

그것은 xmllist 두 가지의보다 일반적인 유형으로 사용해야하는 클래스 : "유형의 값 xmllist XML 문서, XML 조각 또는 XML 객체의 임의 모음 (예 : 쿼리 결과)을 나타냅니다. "

따라서 E4X 쿼리를 유형의 변수로 저장해서는 안되므로 캐스팅 문제가 해결됩니다. XML. 나는 만 사용해야한다 XML 반복을위한 수업 xmllist XML 요소를 분리합니다.

알다시피, 자동으로 변경된 XML 및 Xmllist 유형은 혼란 스러울 수 있습니다. 그러한 일은 영리한 프로그래머 (여기에 Adobe를 가리키는 것)가 사물 주위에 편리한 포장지를 만들 때 발생합니다.

진행되는 것은 일종의 "자동 유형 변환"입니다. XML 유형으로 멈추지 않습니다. 이 예제 XML을 고려하십시오.

<myXml>
    <sound id="0">Boogaloo</sound>
    <sound id="1">Bond theme</sound>
    <sound id="2">2001</sound>
</myXml>

호출되는 변수에 위의 XML이 있다고 가정 해 봅시다. myXml. 다음 예에서 E4X는 하나의 항목으로 XMLLIST를 반환하고 사용하는 첫 번째 XML 항목에 액세스합니다. [0]:

trace(myXml.sound.(@id == 0)[0] == <sound id="0">Boogaloo</sound>);
// traces true

이 예에서 우리는 [0] 파트, 플래시의 자동 유형 변환에 의존합니다. 반환 된 항목은 XML로 변환됩니다.

trace(myXml.sound.(@id == 0) == <sound id="0">Boogaloo</sound>);
// traces true

그러나이 일치하는 XML 노드가 간단한 텍스트 노드를 포함하는 경우 플래시는 유형을 문자열로 자동 변환합니다.

trace(myXml.sound.(@id == 0) == "Boogaloo");
// traces true

텍스트 노드를 숫자 (ID 2가있는 XML 노드)로 해석 할 수 있다면 Flash가 변환합니다. 조차 더 숫자로!

trace(myXml.sound.(@id == 2) == 2001);
// traces true

woot!

그래서 이것에 대해 어떻게해야합니까?

알다시피, 유형과 "편리한"XML 처리에 매우주의해야합니다. 제안 된 관행 중 하나는 항상 배열 액세스 연산자를 사용하여 E4X 결과의 첫 번째 XML 항목을 가리키는 것입니다. 단일 결과를 원할 때 다음과 같습니다.

config.users.admin[0].settings[0].email.(@type == "work")[0];

처음에는 이상하게 보이고 코드에 대한 진실성을 추가하지만 이점은 당신이 찾고 있다고 명시 적으로 말하는 것입니다. 하나 admin 요소, 하나 settings 요소 및 하나 email 유형의 요소 "work". 그리고 당신은 그것의 모습에 익숙해집니다.

또 다른 팁은 항상 사용하는 유형에 캐스트하는 것을 기억하는 것입니다. 몇 가지 예 :

allUsers       = XMLList(config.users);
adminSettings  = XML(config.users.admin[0].settings[0]);
adminWorkEmail = String(config.users.admin[0].settings[0].email.(@type == "work")[0]);
adminBirthYear = int(config.users.admin[0].birthdate[0].@year[0]);

ActionScript 3.0 XMLLIST는 XML 클래스가 2 가지 인 경우 XML을 처리하는 새로운 방법입니다.

새 코드를 작성하는 경우 지금 xmllist를 사용해야합니다.

도움이 되었기를 바랍니다

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