2012-02-29 4 views
0
<products> 
    <product id="1"> 
      <photos> 
      <photo addr="1.jpg" /> 
      </photos> 
      <parameters> 
      <parameter name="name" /> 
      </parameters> 
    </product> 
    </products> 

안녕하세요, 저는이 XML을 가지고 있습니다. 사진 주소 또는 매개 변수 이름과 같은 값을 가져오고 싶습니다. DataGrid의 새 테이블처럼 보입니다. 제품 ID로이 매개 변수를 읽는 방법?C# read DataSet 하위 테이블

 foreach (DataTable t in dataSet.Tables) 
     { 
      Console.WriteLine(t); 
     } 

제품, 사진, 사진, 매개 변수, 매개 변수가 표시됩니다. 내 영어

+0

이 부분은 "DataSet에서 값을 가져 오려고하면 모든 네임 스페이스에 새 테이블을 제공합니다."라는 질문을 던집니다. 별로 의미가 없습니다. 그거 정리 해줄 수 있니? –

+0

어쩌면 이제는 더 명확 해졌습니다 – Ignas

+1

데이터 셋의 xml을로드/저장하면 실제로 데이터 세트에있는 데이터를 저장 한 다음 해당 XML 파일에서 데이터를 다시로드하는 방식으로 끝까지 수행하기를 원합니다. 데이터 집합 개체에 의해. –

답변

0

기본적으로 DataSet의

죄송 요소가 아닌 속성을 기반으로 스키마를 가정합니다. DataSet이 XML을 올바르게 읽을 수 있도록 데이터에 대한 xsd를 작성해야합니다.

이 XML이 생성되는 방식으로 인해 이것을 DataSet에 직접 쉽게 읽을 수있는 방법이 없습니다. xsd.exe을 사용하여 xsd 파일을 생성 한 다음 msdata 네임 스페이스의 적절한 특성으로 직접 편집해야합니다. 그것은 꽤 고통스러운 과정입니다.

당신은 아마 중 하나 LINQ를 사용하여 XML을 다시 작성하거나 적용하여 DataSet으로 올바르게 구문 분석 형태로 문서를 변환 coud

XslCompiledTransform :

<products> 
    <product id="1"> 
     <photo addr="1.jpg" /> 
     <parameter name="name" /> 
    </product> 
</products> 

당신은 또한에 LINQ to XML을 대신 사용하려고 고려할 수 데이터 집합 사용 : 새 XML 레이아웃을 개발하기보다는 기존에 작업하는 경우

var productsInfo = from product in productsElement.Descendants("product") 
        from photo in product.Descendants("photo") 
        from parameter in product.Descendants("parameter") 
        let id = product.Attribute("id") 
        let addr = photo.Attribute("addr") 
        let name = parameter.Attribute("name") 
        select new { ID = id.Value, Addr = addr.Value, Name = name.Value}; 

을 먼저 디자이너를 사용하여 데이터 집합을 만들 수 있습니다. 더미 데이터를 채운 다음 WriteXml을 사용하여 xsd 스키마와 샘플 데이터를 얻을 수 있습니다. XML에서 relationshps를 유지하려면 관계의 Nested 속성을 true로 설정해야합니다 (Nesting DataRelations (ADO.NET) 참조).

+0

나는 exsisting xml을 읽어야합니다. – Ignas

+0

답변에 대한 자세한 정보가 추가되었습니다. – JamieSee

0

좋습니다. 스키마 추론을 사용하여 XSD 파일을 생성 한 다음 xsd.exe를 실행하여 찾고있는 DataSet을 생성해야합니다.

먼저 루트 노드가 없기 때문에 제공 한 XML은 박쥐에서 작동하지 않습니다. 여기 야생 추측을 데려 갈거야,하지만 <products>가 루트 노드 인 경우, 우리는 다음과 같이 당신의 XML 포맷 수 : 우리는 다음이 XML을하고 XmlSchemaInference 클래스를 통해 그것의 XSD를 추론 할 수

<products> 
    <product id="1"> 
    <photos> 
     <photo addr="1.jpg" /> 
    </photos> 
    <parameters> 
     <parameter name="name1" /> 
    </parameters> 
    </product> 
    <product id="2"> 
    <photos> 
     <photo addr="2.jpg" /> 
    </photos> 
    <parameters> 
     <parameter name="name2" /> 
    </parameters> 
    </product> 
</products> 

을 . 나는 위의 XML의 스키마를 유추 할 때, 나는이있어 :

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="products"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element maxOccurs="unbounded" name="product"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="photos"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="photo"> 
         <xs:complexType> 
         <xs:attribute name="addr" type="xs:string" use="required" /> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="parameters"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="parameter"> 
         <xs:complexType> 
         <xs:attribute name="name" type="xs:string" use="required" /> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:unsignedByte" use="required" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

나는 다음 원래 XML을 나타내는 나에게 DataSet 완전한 기능을 준/데이터 세트 옵션으로 xsd.exe을 달렸다. 데이터 집합을 채우고 DataSet.GetXml()을 사용하면 예상되는 XML 결과가 반환됩니다.

최종 참고 사항 : 도메인 개체 등을 통해 DataSets를 사용하는 것을지지하지 않습니다. 귀하의 명시된 목표를 달성하기위한 단계가 무엇인지 보여 드리고 싶습니다.