xml 파일 (실제로는 .rdlc 보고서 파일)을 수정하고 많은 자식 노드가있는 노드를 추가해야합니다. 그 자식 노드에는 다시 자식 노드가 있어야합니다. 사실 이것들은 거의 비슷합니다..Net에 여러 노드가있는 XML 노드를 추가하는 가장 쉬운 방법은 무엇입니까?
<TablixRow>
<Height>0.23622in</Height>
<TablixCells>
<TablixCell>
<CellContents>
<Textbox Name="Textbox1">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value/>
<Style/>
</TextRun>
</TextRuns>
<Style/>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox1</rd:DefaultName>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox5">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value/>
<Style/>
</TextRun>
</TextRuns>
<Style/>
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox5</rd:DefaultName>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
</TablixCells>
</TablixRow>
그래서 가장 쉬운 방법은 무엇입니까? 정상적인 경우에는 XmlNode 및 일부 XmlAttribute 개체를 만들고 노드에 해당 특성을 첨부 한 다음 동일한 방식으로 자식 노드를 만들고 마지막으로 각 자식 노드를 해당 부모 노드에 추가합니다. 말할 필요도없이 내 예제 노드를 처리하는 것은 지루할 것입니다. 그것을 할 수있는 더 쉬운 방법이 있습니까? XmlDocument 클래스와 마찬가지로 LoadXml (xml as string)이라는 함수가 있는데, 이는 문자열을 전체 XML 파일로 가져 와서 strucutre를 구성합니다. 비슷한 방법으로 XmlNode 객체를 생성 할 수 있습니까? 따라서 노드를 나타내는 문자열 전체를 제공하고 값을 변경해야하는 자식 노드로 이동하면됩니다. 감사!
업데이트 : VB.NET을 사용하고 있습니다. XElement를 사용할 때 네임 스페이스에 문제가 하나 있습니다. 이 링크에서 XName Class은 C#에서는 요소와 NS를 결합하기 위해 재정의 연산자를 사용하는 것이 좋지만 VB에서는 모듈 외부의 예제에서 가져 오기를 사용할 것을 권장합니다. Class를위한 작업) 그리고 모든 것이이 NS를 자동으로 사용하게 될 것입니다. 그러나 이것은 사실이 아닙니다. 예를 들어, 내가 지정한 경우
Dim para As XElement = _
<ReportParameter Name="HasErr">
<DataType>Boolean</DataType>
<DefaultValue>
<Values>
<Value>False</Value>
</Values>
</DefaultValue>
<Prompt>ReportParameter1</Prompt>
</ReportParameter>
은 지정된 내역을 자동으로 첨부합니다. 그러나 xml이 xml을 나타내는 동일한 문자열 인 XElement.Parse (xml As String)를 사용하면이 NS를 전혀 추가하지 않으므로 빈 NS를 사용하게됩니다 (XElement를 사용하려는 이유). 구문 분석은 사용자 정의 매개 변수 값을 & MY_TYPE_NAME &과 같이 지정하고 싶습니다. @JohnD의 코드를 사용하는 경우 두 번째 문제는, 내가 생각
xdoc.Root.Elements("ReportParameters").FirstOrDefault()
도 사용하려고 내 선언 및 기본 NS는, 즉 아무 것도 반환하지 않습니다, 그것은 빈 공간 내에서 검색 있지만, 실제로 내가 언급 한 NS에서.
누구든지 MS가 XName 클래스에 대한 생성자가 없도록 만든 이유를 알고 있습니다. 사용하기 전에 네임 스페이스를 지정할 수 있습니까? 그것은 하나의 암시 적 변환이 말한다, 그래서
xdoc.Root.Elements("ReportParameters")
의 요소 이름을 나타내는 문자열을 주어진 때 암시 적으로 하나가 인덱스에 요소의 검색 개체 XName이 생성됩니다. 그러나 그것은 정말로 서투르다.
최신 업데이트 : 이제 업데이트에서 내 첫 번째 문제를 해결하는 해결책을 찾았습니다. 이제 XML 리터럴을 사용하여 XElement를 만들고이를 내부에서 사용할 수 있습니다. 이제 다음과 같이 보입니다 :
Dim paraDefNode As XElement = _
<ReportParameter Name=<%= para.Value %>>
<DataType>String</DataType>
<DefaultValue>
<Values>
<Value>False</Value>
</Values>
</DefaultValue>
<Prompt>ReportParameter1</Prompt>
</ReportParameter>
그리고 지정한 NS가 추가됩니다. (내가 말했듯이, XElement.Parse (string)은 그것을 추가하지 않을 것입니다.) 이제 올바른 노드를 만들 수 있습니다. 두 번째 문제는 여전히 파악할 수 없습니다. 정확한 NS를 검색하지 않기 때문에 요소 이름을 사용하여 대상 노드를 탐색 할 수 없습니다.
어쨌든 XML에 LINQ를 사용하도록 제안한 이후 @JohnD의 게시물에 대답으로 표시 할 것입니다.
답장을 보내 주셔서 감사합니다. 그렇지 않은 경우 대답은 분명하지만 네임 스페이스에 어려움을 겪고 있습니다. 우선, 당신의 코드'xdoc.Root.Elements ("MY_ELEMENT_NAME"). FirstOrDefault()'를 사용할 때 아무것도 반환하지 않습니다. 네임 스페이스와 관련이 있다고 추측하고 있으며이 XName 개체를 검색 할 네임 스페이스를 지정해야합니다. 슬프게도 나는 그런 예를 찾을 수 없었다. 이 링크 : [링크] (http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx#Y1999)에서는 XName 개체를 사용하는 방법에 대한 예제를 제공하지 않습니다. 중간 코드. – tete
두 번째로, 하나의 NS 아래에있는 경우 추가 할 XElement의 네임 스페이스 (예 : xelementToAdd)를 지정해야한다고 생각합니다. 맞습니까? 감사! – tete
삽입하려는 XML 스 니펫을 게시 할 수 있습니까? (MY_ELEMENT_NAME이 (가)있는) – JohnD