2009-04-30 6 views
5

이 문제를 해결하는 가장 좋은 방법을 알고 싶습니다. xml 스키마에서 빈 템플릿 xml을 만들고 싶습니다. 필요한 모든 요소와 속성이 만들어지고 그 값은 모두 빈 문자열입니다..NET에서 xsd에서 xml 파일 만들기

다음 단계는 특정 노드가 가질 수있는 자식 xml 노드를 결정하는 방법입니다. 예. 나는 하나의 자식에 대해 minOccurs = "0", maxOccurs = "unbounded"인 노드를 선택합니다. 그 아이에 대한 모든 것을 알 수있을 것입니다. 그 속성, 이름, 값 유형 등.

상황에 대한 더 많은 정보를 제공하기 위해, 나는 사용자가 xml 파일을 편집 할 수있는 도구를 만들고 있습니다. 더 사용자 친화적 인 설정. 예를 들어, 그들은 'account db'노드에 새로운 계정을 추가 할 수 있으며 사용 가능한 유일한 노드가 계정 노드라는 것을 알게됩니다. 그런 다음 계정 노드에 자식을 추가하려고 할 때 이름 노드 (필수), 암호 노드 (필수), 설정 노드 (선택 사항) 등을 선택할 수 있습니다. 계정 노드에서 사용할 수있는 자식을 프로그래밍 방식으로 결정하려면 어떻게해야합니까? 그 아이들의 속성과 설정은 무엇입니까?

이것은 .NET 2.0을 사용하는 C# 2.0에 있습니다.

요약하면 스키마를 읽고 XML을 만드는 데 유용한 정보를 얻기 위해 어떤 클래스를 사용합니까? 내 순진함에는 xsd 자체가 xml 이었기 때문에 내가 통과 할 수있는 일종의 DOM 모델이있을 것이라는 희망이있었습니다. 좋아요 것

은 내 프로그램에 국한한다 그래서 등 OxygenXml, VS, xsd.exe, 같은 외부 도구를 사용하지 않음

+1

가능한 복제본 [.NET의 XSD 스키마에서 샘플 XML 문서를 생성하는 클래스가 있습니까?] (http://stackoverflow.com/questions/41674/is-there-a-class-to-generate-a) -sample-xml-document-from-xsd-schema-in-net) –

답변

1

당신이하고 싶은 것은 대부분의 XML 편집기에서 XML 인텔리 센스 기능을 복제 한 것 같습니다. 즉 XML 스키마를 읽고 어떤 요소와 속성이 다음에 올지 알아 내야합니다.

우리는 얼마 전에 우리가 한 프로젝트에서 비슷한 것을했습니다. 대부분의 시간 동안 작동하는 것을 생산하려면 많은 일이 필요합니다. 항상 작동하는 제품은 많은 작업입니다!

기본적으로 XSD를로드해야합니다 (이 작업을 수행 할 수 있도록 .net의 XmlSchema 개체가 필요합니다). 그러나 그들이 드러내는 SOM 객체 모델은 매우 원시적이어서, 당신은 그것을 해석하기 위해 많은 작업을해야합니다. 대체 그룹, complexType 확장, 카멜레온 스키마 및 네임 스페이스와 같은 개념을 무시하면 SOM을 비교적 쉽게 탐색 할 수 있어야합니다.

다음은 스키마와 관련된 XML 문서의 위치를 ​​알아야합니다. SOM에 있다는 것을 알게되면 사용 가능한 옵션을 찾아 낼 수 있습니다.

제대로하려면 1,000 줄의 코드와 4-12 주일의 작업이 필요합니다. 몇 주 안에 기본적인 것을 얻을 수 있을까요?

+0

그래, 내가이 일을 시작할 때 내가 발견 한거야. 이것을위한 라이브러리를 만들려면 실제로 몇 시간이 걸릴 것입니다. XmlSchema 개체를 탐색하고 현재 필요한 정보를 선택하여 가져 오지 못했습니다. – ipwnponies

0

당신이 그런 XMLSPY (link)와 같은 타사 도구를 사용할 수 있습니다. xsd에서 더미 XML을 만들거나 그 반대의 경우도 마찬가지입니다.

:

정말 로터리 (하지만 무료) 당신은 당신의 컴퓨터에 존재하는 .NET 툴을 할 수있는 방법은 기업이 스키마는 다음과 같은 사용하여 정의하는 객체를 생성 xsd.exe (link)를 사용하는 것

xsd /classes /language:CS XSDSchemaFile.xsd 

개체가 있으면 프로젝트에로드하고 일련 번호를 지정합니다. 더미 데이터를 추가하려는 경우 속성 등을 채울 수 있습니다.

+0

죄송합니다. 이것을 지적하지 않으셔서, 내 프로그램 내에서만이 작업을 수행하고 싶습니다. 필자가 원했던 가장 중요한 정보는 필요한 정보를 스키마로 파싱 할 수있는 방법 또는 클래스입니다. – ipwnponies

1

나는 MSDN 문서로 눈을 피었고 냄새를 맡았습니다. XmlSchema.Read를 사용하여 스키마를로드하고 컴파일합니다. Elements 속성에는 '최상위 수준'요소의 컬렉션이 포함됩니다. 루트 요소 나 다른 요소의 정규화 된 이름을 하드 코딩해야합니다. 그럼 그게 전부 야. 주어진 스키마 요소 아래에서 '내용'을 찾는 방법을 아직 찾지 못했습니다.

편집 : 더 많은 경로를 찾았지만 아직 명확하지 않습니다. XmlSchemaElements에는 스키마 형식 속성이 있습니다. 이것은 단순하거나 복잡합니다. xml 스키마의 복합 유형은 속성, 시퀀스, 그룹 등을 가질 수 있습니다. 시퀀스에는 요소가 될 수있는 particle이라는 속성이 있습니다. 그리고 그 사이클이 반복됩니다. 그러나 구현의 어려운 부분은 가능한 모든 경우 (단순 유형, 복잡한 유형의 속성, 속성 및 요소가있는 복잡한 유형, 확장자, 전체 세 번)를 모두 포함하는지 확인하는 것입니다.

편집 : XmlSchema 개체의 Element 속성을 사용하여 XmlSchemaElement를 가져옵니다. XmlSchemaElement의 SchemaType 속성을 사용하여 단순하거나 복잡한 형식을 가져옵니다. XmlSchemaComplexType의 Attribute 속성을 사용하여 속성을 가져 오거나 ContentModel을 사용하여 '단순한 내용'/ '복잡한 내용'또는 Particle을 가져 와서 '순서'/ '선택'/ '모두'를 가져옵니다.기본적으로 프로퍼티를 내려보고 유형을 검사하고 객체를 왼쪽이나 오른쪽으로 캐스팅하고 xsd 객체의 가능한 모든 배열을 확인합니다. 라이브러리를 만들려면 길고 번거롭고 오류가 발생하기 쉽습니다. 그리고 이것은 XML 스키마와 함께, dtds와 나는 생각조차 시작하고 싶지 않습니다. 와우, XML 스키마가 필요하지만 왜 그렇게 악할 수 있습니까?

관련 문제