2009-07-09 4 views
3

내가 정보를 추적 액세스 UPS에 노력하고있어, 자신의 예에 따라, 내가 지금 같은 요청을 구축해야합니다C#을 XmlDocument 노드

<?xml version="1.0" ?> 
<AccessRequest xml:lang='en-US'> 
    <AccessLicenseNumber>YOURACCESSLICENSENUMBER</AccessLicenseNumber> 
    <UserId>YOURUSERID</UserId> 
    <Password>YOURPASSWORD</Password> 
</AccessRequest> 
<?xml version="1.0" ?> 
<TrackRequest> 
    <Request> 
    <TransactionReference> 
     <CustomerContext>guidlikesubstance</CustomerContext> 
    </TransactionReference> 
    <RequestAction>Track</RequestAction> 
    </Request> 
    <TrackingNumber>1Z9999999999999999</TrackingNumber> 
</TrackRequest> 

내가 1을 XmlDocument로 이것을 만드는 데 문제를 기음#. 내가 두 번째를 추가하려고하면 : I 표준을 XmlDocument 만 1 개 루트 노드를하기 때문입니다 추측하고있어

System.InvalidOperationException: This document already has a 'DocumentElement' node.

: <?xml version="1.0" ?> or the <TrackRequest> 는 오류가 발생합니다. 어떤 아이디어?

Heres는 지금까지 내 코드 :

XmlDocument xmlDoc = new XmlDocument(); 
XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); 
XmlElement rootNode = xmlDoc.CreateElement("AccessRequest"); 
rootNode.SetAttribute("xml:lang", "en-US"); 
xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement); 
xmlDoc.AppendChild(rootNode); 

XmlElement licenseNode = xmlDoc.CreateElement("AccessLicenseNumber"); 
XmlElement userIDNode = xmlDoc.CreateElement("UserId"); 
XmlElement passwordNode = xmlDoc.CreateElement("Password"); 

XmlText licenseText = xmlDoc.CreateTextNode("mylicense"); 
XmlText userIDText = xmlDoc.CreateTextNode("myusername"); 
XmlText passwordText = xmlDoc.CreateTextNode("mypassword"); 

rootNode.AppendChild(licenseNode); 
rootNode.AppendChild(userIDNode); 
rootNode.AppendChild(passwordNode); 

licenseNode.AppendChild(licenseText); 
userIDNode.AppendChild(userIDText); 
passwordNode.AppendChild(passwordText); 

XmlElement rootNode2 = xmlDoc.CreateElement("TrackRequest"); 
xmlDoc.AppendChild(rootNode2); 
+0

오류가 발생한 위치에 코드를 게시 할 수 있습니다. 그렇지 않으면 우리는 전화를 통해 질문을받는 자동차 역학과 같습니다 : "내 차는 시작되지 않을 것입니다. 무엇이 문제입니까?" – Cyberherbalist

+0

또한이 예제는 한 요청에 대한 것입니까? 두 가지 유형의 요청과 비슷합니다. 첫 번째는 액세스를 요청하고 두 번째는 추적 정보를 요청하는 것입니다. –

+0

이것은 정확히 그들의 예를 보여줍니다. 우리는 고전적인 ASP에서 비슷한 것을 사용하며, 두 xml 요청은 모두 Msxml2.ServerXMLHTTP 객체를 통해 동시에 전송됩니다. –

답변

9

XML 문서에는 하나의 루트 노드 만있을 수 있습니다. 그렇지 않으면 잘 형성되지 않습니다. 한 번에 두 가지를 보내야하는 경우 2 xml 문서를 만들고 함께 가입해야합니다.

0

빌드 두 개의 별도의 XML 문서와 자신의 캐릭터 라인 표현을 연결.

2

유효하지 않은 xml을 만들려고하기 때문에 예외가 발생합니다. XmlDocument는 올바른 형식의 XML 만 생성합니다.

XMLWriter를 사용하고 XmlWriterSettings.ConformanceLevel을 Fragment로 설정하거나 두 개의 XmlDocument를 만들고 같은 스트림에 쓸 수 있습니다.

0

노드 구조가 항상 같아 보입니다. (조건부 로직이 보이지 않습니다.) 구조가 일정하면 XML 템플릿 문자열을 정의 할 수 있습니다. 해당 문자열을 XML 문서로로드 & SelectNode를 사용하여 개별 노드를 채 웁니다.

프로그래밍 방식으로 루트를 만드는 것보다 더 간단 할 수도 있고 정리할 수도 있습니다 (요소 & 노드).