2009-07-10 2 views
2

루프 처리해야하는 상당히 크고 복잡한 XML 문서가 있습니다. xmlns는 문서 상단에 정의되어 있지만이 URL은 더 이상 사용할 수 없습니다.네임 스페이스가 더 이상 사용 가능하지 않을 때 xml 문서를 구문 분석합니다.

파일을 구문 분석하여 C#을 사용하여 중요한 데이터를 가져 오는 가장 좋은 방법은 무엇입니까?

데이터 집합에로드하려고 시도했지만 때때로 오류가 발생합니다. 테이블 (끝점)은 중첩 관계에있는 자체 테이블이 될 수 없습니다. 또는 요소 열이나 중첩 된 관계가 포함 된 테이블에 SimpleContent 열을 추가 할 수 없습니다.

XPath는 다음 호출 포트 였지만 네임 스페이스가 부족하여 문제가있었습니다.

이것이 내 옵션을 심각하게 제한하는 것으로 생각되지만 누구에게도 제안이 있습니까? XML 문서의

발췌문 :

<?xml version="1.0" encoding="UTF-8"?> 
<cdr:cdr_set xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr"> 

<!-- Copyright (c) 2001-2009, all rights reserved --> 

<cdr:cdr xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr"> 
    <cdr:call_id>2040-1247062136726-5485131</cdr:call_id> 
    <cdr:cdr_id>1</cdr:cdr_id> 
    <cdr:status>Normal</cdr:status> 
    <cdr:responsibility> 
    <cdr:tenant id="17"> 
     <cdr:name>SpiriTel plc</cdr:name> 
    </cdr:tenant> 
    <cdr:site id="45"> 
     <cdr:name>KWS</cdr:name> 
     <cdr:time_zone>GB</cdr:time_zone> 
    </cdr:site> 
    </cdr:responsibility> 
    <cdr:originator type="sipGateway"> 
    <cdr:sipGateway id="3"> 
     <cdr:name>Audiocodes-91</cdr:name> 
    </cdr:sipGateway> 
    </cdr:originator> 
    <cdr:terminator type="group"> 
    <cdr:group> 
     <cdr:tenant id="17"> 
     <cdr:name>SpiriTel plc</cdr:name> 
     </cdr:tenant> 
     <cdr:type>Broadcast</cdr:type> 
     <cdr:extension>6024</cdr:extension> 
     <cdr:name>OLD PMS DDIS DO NOT USE</cdr:name> 
    </cdr:group> 
    </cdr:terminator> 
    <cdr:initiation>Dialed</cdr:initiation> 
    <cdr:calling_number>02087893850</cdr:calling_number> 
    <cdr:dialed_number>01942760142</cdr:dialed_number> 
    <cdr:target>6024</cdr:target> 
    <cdr:direction>Inbound</cdr:direction> 
    <cdr:disposition>No Answer</cdr:disposition> 
    <cdr:timezone>GB</cdr:timezone> 
    <cdr:origination_timestamp>2009-07-08T15:08:56.727+01:00</cdr:origination_timestamp> 
    <cdr:release_timestamp>2009-07-08T15:09:26.493+01:00</cdr:release_timestamp> 
    <cdr:release_cause>Normal Clearing</cdr:release_cause> 
    <cdr:call_duration>PT29S</cdr:call_duration> 
    <cdr:redirected>false</cdr:redirected> 
    <cdr:conference>false</cdr:conference> 
    <cdr:transferred>false</cdr:transferred> 
    <cdr:estimated>false</cdr:estimated> 
    <cdr:interim>false</cdr:interim> 
    <cdr:segments> 
    <cdr:segment> 
     <cdr:originationTimestamp>2009-07-08T15:08:56.727+01:00</cdr:originationTimestamp> 
     <cdr:initiation>Dialed</cdr:initiation> 
     <cdr:call_id>2040-1247062136726-5485131</cdr:call_id> 
     <cdr:originator type="sipGateway"> 
     <cdr:sipGateway id="3"> 
      <cdr:name>Audiocodes-91</cdr:name> 
     </cdr:sipGateway> 
     </cdr:originator> 
     <cdr:termination_attempt> 
     <cdr:termination_timestamp>2009-07-08T15:08:56.728+01:00</cdr:termination_timestamp> 
     <cdr:terminator type="group"> 
      <cdr:group> 
      <cdr:tenant id="17"> 
       <cdr:name>SpiriTel plc</cdr:name> 
      </cdr:tenant> 
      <cdr:type>Broadcast</cdr:type> 
      <cdr:extension>6024</cdr:extension> 
      <cdr:name>OLD PMS DDIS DO NOT USE</cdr:name> 
      </cdr:group> 
     </cdr:terminator> 
     <cdr:provided_address>01942760142</cdr:provided_address> 
     <cdr:direction>Inbound</cdr:direction> 
     <cdr:disposition>No Answer</cdr:disposition> 
     </cdr:termination_attempt> 
    </cdr:segment> 
    </cdr:segments> 
</cdr:cdr> 

... 

</cdr:cdr_set> 

각 항목은 기본적으로 동일하지만 같은 일부 필드 등의 차이 그들이 필요하지 않은 경우 누락 될 수 있습니다 가끔있다. XML 파일

+0

(예를 들어 주석이 다시 업데이트되었습니다.) –

답변

5

이러한 값은 식별자하지 로케이터이다. 스키마를 다운로드 할 예정이 아니라면, 스키마가 전혀 필요하지 않으며 필요에 따라 "흔들릴"수 있습니다. 가장 좋은 방법은 XmlDocument/XDocument에로드하고 데이터에 액세스하려고하는 것입니다. 예를 들어

:

XmlDocument doc = new XmlDocument(); 
doc.Load("cdr.xml"); 
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); 
ns.AddNamespace("cdr", "http://www.naturalconvergence.com/schema/cdr/v3/cdr"); 
XmlElement el = (XmlElement)doc.SelectSingleNode(
    "cdr:cdr_set/cdr:cdr/cdr:originator", ns); 
Console.WriteLine(el.GetAttribute("type")); 

또는 cdr 요소를 루프

: 문서에 사용 된 별칭 따라서 XmlNamespaceManager에서 사용되는 별명에 크게 관련이없는 것으로

foreach (XmlElement cdr in doc.SelectNodes("/cdr:cdr_set/cdr:cdr", ns)) 
    { 
     Console.WriteLine(cdr.SelectSingleNode("cdr:call_id", ns).InnerText); 
    } 

참고 다시 선언해야합니다. 나는 C#의 별칭으로 x을 쉽게 사용할 수있었습니다.


물론 개체 모델로 작업하려는 경우, (cdr.xml이 예제 파일입니다) xsd를 통해 실행

xsd cdr.xml 
xsd cdr.xsd /classes 

지금 당신이 XmlSerializer으로로드 할 수 있습니다.

+0

나는 이것을 시도하고 있습니다. XmlNodeList nodes = root.SelectNodes ("/ cdr : cdr"); 은 "네임 스페이스 관리자 또는 XsltContext 필요"예외를 생성합니다.이 쿼리에는 접두사, 변수 또는 사용자 정의 함수가 있습니다. " –

+0

(질문에 대답) –

+0

코드 일은 작동, 당신이 다르게 한 생각이 전혀, 내 xpath 쿼리가 잘못되었다고 가정합니다. Thnak you! –

1

alternativley Xdocument로로드하고 linq2XML? ... 같은 오류가 발생할 수도 있지만

원하는 데이터가 무엇인지 모르겠으므로 검색어를 제안하기가 어렵습니다. 나는 대부분 xDocument에 XDocument를 사용하는 것을 개인적으로 선호합니다.

XSD의 자동 생성과 관련된 유일한 문제는 적절한 크기의 샘플 데이터를 사용하지 않으면 데이터 유형이 잘못 표시 될 수 있다는 것입니다.

+0

사실, 내가 그것을 시도했을 때, xsd는 실제로 XmlSerializer가로드를 거부 한 매우 가난한 일을했다 ... –

+0

나는 너의 고통을 느낀다.) 나는 보통 자동으로 생성 된 xsd를 다시 작성하지만 ... 적어도 그 좋은 출발점. –

관련 문제