2011-11-03 3 views
0

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의 게시물에 대답으로 표시 할 것입니다.

답변

3

.NET 4를 사용할 수 있다면 XDocument을 살펴 보는 것이 좋습니다.다음은 문서에 요소를 추가하는 예입니다

http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.add.aspx

당신은 파일에서 초기화 XDocument.Load을 문자열에서 문서를 초기화 XDocument.Parse를 사용하거나 수는 (다른 오버로드도있다).

그런 다음 삽입 할 요소로 이동하고 여기에 XElement.Add()

을 할 수있는 또 다른하여 XDocument로 XML 요소를두고 몇 가지 예제 코드입니다.

 public static void Main() 
     { 

      var xelementToAdd = XElement.Parse(@" 
       <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> 
          <DefaultName>Textbox1</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> 
          <DefaultName>Textbox5</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>"); 

      // you might use XDocument.Load() here instead of Parse() 
      var xdoc = XDocument.Parse(@" 
<Report xmlns='http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition' 
     xmlns:rd='http://schemas.microsoft.com/SQLServer/reporting/reportdesigner' 
     xmlns:msxsl='urn:schemas-microsoft-com:xslt' 
     xmlns:xs='http://www.w3.org/2001/XMLSchema' 
     xmlns:msdata='urn:schemas-microsoft-com:xml-msdata'> 
    <rd:DrawGrid>true</rd:DrawGrid> 
    <ReportParameters></ReportParameters> 
</Report> 
      "); 

      XNamespace ns1 = "http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition"; 
      XNamespace ns2 = "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"; 
      XNamespace ns3 = "urn:schemas-microsoft-com:xslt"; 
      XNamespace ns4 = "http://www.w3.org/2001/XMLSchema"; 
      XNamespace ns5 = "urn:schemas-microsoft-com:xml-msdata"; 

      var e = xdoc.Root.Elements(ns1 + "ReportParameters") 
       .FirstOrDefault(); 

      e.Add(xelementToAdd); 
      xdoc.Save(@"c:\temp\foo2.xml"); 
     } 

그리고 그것은 가치가 무엇인지에 대한

, 내가 불통 ... 난 그냥 목표 XDcoument의 첫 번째 "Elem 모델"노드에 XML을 추가 해요,하지만 당신은 그것을 등 여러 번 추가 할 코드를 조정할 수 샘플 XML을 사용하여 네임 스페이스 접두어를 제거하고 (네임 스페이스는 질문과 별도로 문제가됩니다) 큰 따옴표를 작은 따옴표로 바꿉니다 (XML은 다른 점은 동일 함).

업데이트 : 예, 네임 스페이스에 문제가 있습니다. <ReportParameters> 요소에 <rd:DrawGrid>과 같은 접두어가 없더라도 기본 네임 스페이스를 사용하므로이를 지정해야합니다. 업데이트 된 샘플을 살펴보십시오. 원하는 샘플을 수행 할 수 있습니다. 희망이 도움이!

+0

답장을 보내 주셔서 감사합니다. 그렇지 않은 경우 대답은 분명하지만 네임 스페이스에 어려움을 겪고 있습니다. 우선, 당신의 코드'xdoc.Root.Elements ("MY_ELEMENT_NAME"). FirstOrDefault()'를 사용할 때 아무것도 반환하지 않습니다. 네임 스페이스와 관련이 있다고 추측하고 있으며이 XName 개체를 검색 할 네임 스페이스를 지정해야합니다. 슬프게도 나는 그런 예를 찾을 수 없었다. 이 링크 : [링크] (http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx#Y1999)에서는 XName 개체를 사용하는 방법에 대한 예제를 제공하지 않습니다. 중간 코드. – tete

+0

두 번째로, 하나의 NS 아래에있는 경우 추가 할 XElement의 네임 스페이스 (예 : xelementToAdd)를 지정해야한다고 생각합니다. 맞습니까? 감사! – tete

+0

삽입하려는 XML 스 니펫을 게시 할 수 있습니까? (MY_ELEMENT_NAME이 (가)있는) – JohnD

관련 문제