2009-12-22 1 views
3

희망하는 포럼을 선택했습니다.DataSet에서 XML 직렬화 제어 - "TableName 요소"에 대한 특성

일반 사용자 지정 구성 요소의 GetDS 메서드에서 제공되는 테이블이 하나있는 데이터 집합 개체가 있습니다. XML을 다른 프로세스 (바이트 배열로 청크)에 전달해야합니다. 모든 작업이 있지만 XML은 소비 프로세스에서 기대하는 일부 특성이 누락되었습니다.

나는 DataSet 개체를 생성하고이 같은 TABLENAME (루트 요소)의 이름과 행 제어 할 수 있습니다 : 나는 다음과 같은 XML로 직렬화 할은 GetXML 방법을 사용

da.Fill(ds, "Foo") 
ds.DataSetName = "FooUpload" 

을 :

<?xml version="1.0" standalone="yes" ?> 
<FooUpload> 
    <Foo> 
    <FooMasterID>483</FooMasterID> 
    <Country>27</Country> 
    <PaymentCode>ANN</PaymentCode> 
    <Amount>132</Amount> 
    <PaidDate>2012-12-31 00:00:00</PaidDate> 
    <PaidBy>FooServices</PaidBy> 
    </Foo> 
</FooUpload> 

호출 프로세스는

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
<FooUpload **ClientCode="FOOO" RecordCount="1" CreateDate="2008-12-09T15:02:18.920" CreateUser="valli"**> 
    <Foo> 
    <FooMasterID>483</FooMasterID> 
    <Country>27</Country> 
    <PaymentCode>ANN</PaymentCode> 
    <Amount>132</Amount> 
    <PaidDate>2012-12-31 00:00:00</PaidDate> 
    <PaidBy>FooServices</PaidBy> 
    </Foo> 
</FooUpload> 

참고에 속성을 기대 FooUpload 요소. 이 노드는 DataSet에있는 DataTable의 이름입니다.

XMLSerializer를 제어하고 사용자 지정 개체에 대한 많은 예제를 찾는 방법을 검색했습니다. 나는 심지어 가까이에있는 MappingType.Attribute가되도록 열 매핑을 설정하는 예제를 발견했지만 실제로이 데이터 집합의 TableName 인 루트 요소를 사용하여이 작업을 수행해야합니다.

나는 좀 더 우아한 해결책을 찾지 못하면 변형 된 문자열과 XML의 나머지 부분을 반복하면서 침을 튀기는 것과 같은 해킹을 만들어야 할 것입니다.

미리 감사드립니다 (손가락이 낀)!

답변

0

GetXML의 출력을 XmlDocument로 공급하고 나중에 특성을 추가 할 수 있습니다. 예를 들어 :

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(ds.GetXml()); 
XmlAttribute attr=xdoc.CreateAttribute("ClientCode"); 
attr.Value = "FOOOO"; 
xdoc.DocumentElement.Attributes.Append(attr); 

그런 다음 당신은 파일에 xdoc을 절약 할 수 있습니다, 또는 예를 들어, 문자열에 넣어 :

XmlTextWriter xw = new XmlTextWriter(new MemoryStream(),Encoding.UTF8); 
xdoc.Save(xw); 
xw.BaseStream.Position = 0; 
StreamReader sr = new StreamReader(xw.BaseStream); 
string result = sr.ReadToEnd(); 
+0

이것이 실제로 유일한 방법 일 수 있다고 생각합니다. DataSet serialization이 혼합 된 형식을 처리하지 않는다는 것이 "의도적으로"나와 있다는 것을 알게되었습니다. – sdmcnitt

+0

@sdmcnitt : 그럼 내 대답에 투표하십시오. 그리고 만약 당신이 그것을 사용할 것이라고 생각한다면 받아 들여야합니다. –

+0

투표에 "15 평판"이 필요합니다. 나는 악명 높은 것 같아요. – sdmcnitt

0

This 당신이 찾고있는 것과 거의 보인다.

+0

감사합니다. uli78. ExtendedProperties가 실제로 속성으로 직렬화하는 것처럼 보이지만 테이블 자체가 아닌 테이블 열에 만 적용될 수있는 것처럼 보입니다. FooUpload 요소의 특성에 유의하십시오. 이 노드는 DataSet에있는 DataTable의 이름입니다. DataSet이 serialize 될 때 루트 요소는 테이블 이름 인 것처럼 보입니다. DataSet의 테이블에 대한 특성과 같은 것이 있습니까? – sdmcnitt

+0

예, 있습니다. ".ExtendedProperties" – uli78