.NET의 XML DOM 클래스들
XML Document의 부분 | 부분에 해당하는 클래스 |
---|---|
document element | XmlElement |
processing instructions | XmlProcessingInstruction |
Element | XmlElement |
Attribute | XmlAttribute |
Test values | XmlText |
Nodes | XmlNode |
건물 에너지, IT와 여러 가지 글들
.NET의 XML DOM 클래스들
XML Document의 부분 | 부분에 해당하는 클래스 |
---|---|
document element | XmlElement |
processing instructions | XmlProcessingInstruction |
Element | XmlElement |
Attribute | XmlAttribute |
Test values | XmlText |
Nodes | XmlNode |
프로그래밍을 하다보면 기계적으로 반복해야 할 일들이 생긴다. 이런 일들로 일일이 타이핑을 한다는 것은 매우 지루하고 따분한 일이다. 그래서 코드을 자동으로 생성하도록 할 필요가 생긴다.
곧 개발환경의 매크로를 이용하거나, Perl과 같은 문자열 처리기를 통하여 코드를 자동처리하도록 한다.
다음의 사이트도 그 중의 하나이다.
http://kimsk99.springnote.com/pages/63531
– 미리 지정된 텍스트를 현재 커서위치(실렉트된 것)에 삽입하는 매크로
– 현재 편집중인 파일과 같은 이름이고 확장자만 cpp <-> h 로 바뀐 파일을 열어주는 매크로
http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8423&ref=8423
– 이름과 날짜를 입력
– 수평 라인 주석을 입력
1 2 3 4 5 |
Sub InsertHorizontalLine() Dim lineString = "//----------------------------------------------------------------------------" + vbCrLf Dim sel As TextSelection = DTE.ActiveDocument().Selection() sel.Text() = lineString End Sub |
http://serious-code.net/tc/tag/Visual%20Studio%20Macro
– 선택된 라인들에서 중복된 라인들은 삭제하고 나머지를 정렬하기
– 자동으로 getter/setter생성하기
1 2 3 4 5 6 7 |
' Inserts name and date Sub Signature() Dim sel As TextSelection = DTE.ActiveDocument.Selection sel.Insert("// Seungwoo Oh ") sel.Insert(Format(Date.Today, "yyyy-MM-dd")) sel.Insert(".") End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Function Strip(ByVal strLine As String) If Len(strLine) > 0 Then nBegin = 1 nEnd = Len(strLine) For i = 1 To Len(strLine) c = Mid(strLine, i, 1) If c <> " " And c <> Tab And c <> Lf And c <> Cr Then nBegin = i Exit For End If Next For i = 1 To Len(strLine) c = Mid(strLine, Len(strLine) - i + 1, 1) If c <> " " And c <> Tab And c <> Lf And c <> Cr Then nEnd = Len(strLine) - i + 1 Exit For End If Next Return Mid(strLine, nBegin, nEnd - nBegin + 1) Else Return "" End If End Function |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Sub SortCollection(ByRef oCollection As Collection, Optional ByVal bSortAscending As Boolean = True) Dim lSort1 As Integer Dim lSort2 As Integer Dim vTempItem1 As Object
Dim vTempItem2 As Object
Dim bSwap As Boolean For lSort1 = 1 To oCollection.Count - 1 For lSort2 = lSort1 + 1 To oCollection.Count If bSortAscending Then If oCollection(lSort1) > oCollection(lSort2) Then bSwap = True Else bSwap = False End If Else
If oCollection(lSort1) < oCollection(lSort2) Then bSwap = True Else bSwap = False End If End If If bSwap Then vTempItem1 = oCollection(lSort1) vTempItem2 = oCollection(lSort2) oCollection.Add(vTempItem1, Nothing, lSort2) oCollection.Add(vTempItem2, Nothing, lSort1) oCollection.Remove(lSort1 + 1) oCollection.Remove(lSort2 + 1) End If Next Next End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub SortAndRemoveDuplicatedLine() Dim objLines As New Collection
Dim objSel As TextSelection = ActiveDocument().Selection Dim objRanges As TextRanges = objSel.TextRanges
Dim objStartPt As EditPoint = objRanges.Item(1).StartPoint.CreateEditPoint() Dim objStream As New StringBuilder For Each strLine In objSel.Text.Split(Lf) strLine = Strip(strLine) If objLines.Contains(strLine) = False Then objLines.Add(strLine, strLine) End If Next SortCollection(objLines) For Each strLine In objLines objStream.AppendLine(strLine) Next objSel.Text = "" objStartPt.Insert(objStream.ToString()) End Sub |
프로그램을 개발한 다음, 사용자가 설치해서 사용할 수 있도록 하기 위해서는 ‘설치용 프로그램'(일명 setup 프로그램)을 만들어야 한다.
Visual Studio .NET 2005에서는 솔루션에 ‘설치 프로젝트’를 추가하여 개발 프로그램을 설치가능하게 할 수 있다.
다음의 사이트는 이것을 잘 설명하고 있다.
http://www.nohungry.net/tt1/tag/110
Hey all,
Simple question, I just want to select the text from the <Template> tag. Here’s what I have, but the Xpath doesn’t match anything.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static void TestXPath() { string xmlText = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"; xmlText += "<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">"; xmlText += "<Template>Normal</Template> <TotalTime>1</TotalTime> <Pages>1</Pages> <Words>6</Words>"; xmlText += "</Properties>"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new System.IO.StringReader(xmlText)); foreach (XmlNode node in xmlDoc.SelectNodes("//Template")) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } } |
You need to use an XmlNamespaceManager because the
Template element is in a namespace:
1 2 3 4 5 6 7 8 9 10 |
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(new System.IO.StringReader(xmlText)); XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable); manager.AddNamespace("ns", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties"); foreach (XmlNode node in xmlDoc.SelectNodes("//ns:Template", manager)) { Console.WriteLine("{0}: {1}", node.Name, node.InnerText); } |
비주얼 베이직 6.0에서 비주얼 베이직 닷넷(이하 비베닷넷)으로 옮기는 과정에서 참 많은 것이 장벽이었는데, 이런 것들 한 방에 해결해 준 책이 바로
비베닷넷이 되면서 완전히 객체지향 프로그래밍 언어로 탈바꿈했다. 객체지향프로그래밍의 핵심은 그 무엇보다도 객체를 만들어내는 설계도 같은 클래스라고 할 수 있다. 책 제목에서도 알 수 있듯이 이 클래스를 어떻게 효과적으로 설계할 것인가를 자세히 다루고 있다.
참 맛있게 읽은 책이다.
During object-oriented analysis and design, we identify the most important objects in our system, and consider how they relate to each other. But during object-oriented programming, we don’t write ‘objects’; we define classes to represent the behavior and attributes of objects.
객체지향 분석과 설계를 하는 동안에, 우리는 우리 시스템 안의 가장 중요한 객체를 규명하고, 서로간에 어떻게 관계하는지를 고려한다. 그러나 객체지향 프로그래밍을 하는 동안에는 ‘객체들’을 작성하지 않는다. 다만 객체들의 행위와 속성을 대표하는 클래스를 정의한다.
(본문 중에서)
마이크로소프트의 도움말 사이트 http://support.microsoft.com/?id=322090
삼각함수 비교
설명 | Excel | VBA | VB6 | VB.NET | 비고 | |
---|---|---|---|---|---|---|
sin | 사인함수 | Sin | Sin | Sin | Sin | |
cos | 코사인함수 | Cos | Cos | Cos | Cos | |
tan | 탄젠트함수 | Tan | Tan | Tan | Tan | |
arcsin | 사인역함수 | Asin | – | – | Asin | |
arccos | 코사인역함수 | Acos | – | – | Acos | |
arctan | 탄젠트역함수 | AtanAtan2 | Atn | Atn | AtanAtan2 | |
sinh | 하이퍼볼릭사인함수 | Sinh | – | – | Sinh | |
cosh | 하이퍼볼릭코사인함수 | Cosh | – | – | Cosh | |
tanh | 하이퍼볼릭탄젠트함수 | Tanh | – | – | Tanh | |
arcsinh | 하이퍼볼릭사인역함수 | Asinh | – | – | – | |
arccosh | 하이퍼볼릭코사인역함수 | Acosh | – | – | – | |
arctanh | 하이퍼볼릭탄젠트역함수 | Atanh | – | – | – |
이상에서 보듯 VB6와 VBA로 프로그래밍을 하고자 하면, 삼각함수의 역함수를 작성해야 한다.
만약 VBA에서 새로 역함수를 작성하지 않고, 엑셀함수를 사용하고자 한다면 다음과 같이 하면 된다.
1 2 |
area = WorksheetFunction.Pi * radius ^ 2 a = WorksheetFunction.Acos(b) |
Visual Basic .NET에 대한 설명서가 잘 정리된 웹페이지를 소개한다.
http://www.java2s.com/Tutorial/VB/CatalogVB.htm
키워드(keyword) 별로 어떻게 쓰이는지 알고 싶다면, 꼭 한 번 들를만 하다.
또한, 비주얼베이직 닷넷 말고 지구상에 존재하는 웬만한 프로그래밍 언어에 대한 설명서도 함께 있다. 여기서는 비주얼 베이직 닷넷만 연결해 놓은 것이다. 왜? 이 홈피의 주관심사여서. ^^
일조, 일사, 조망을 분석하는 프로그램인 SolarView를 등록하였다.
지평좌표계로 변환할 때, 방위각을 계산하면 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single '천구상의 방위각을 계산한다. '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각 '즉, 시각좌표계에서 사용해야 함. ' '1) 특수한 경우의 방위각 계산 If Math.Abs(x) < Single.Epsilon Then If y > 0 Then Return 0.0F '--> 예) (0,1)의 방위각은 0도 Else Return Math.PI '--> 예) (0,-1)의 방위각은 180도 End If End If ' If Math.Abs(y) < Single.Epsilon Then Return Math.Sign(x) * Math.PI / 2 '--> 예) (1,0)은 90도, (-1,0)은 -90도 End If ' '2) 일반적인 경우의 방위각 계산 Dim v1 As Single = Math.Atan(Math.Abs(x / y)) If y > 0 Then Return Math.Sign(x) * v1 '--> 예) (1,1)은 45도, (-1,1)은 -45도 Else Return Math.Sign(x) * (Math.PI - v1) '--> 예) (1,-1)은 135도, (-1,-1)은 -135도 End If ' End Function |
If문에서 발생할 확률이 더 많은 것을 전진배치하면, 다음과 같이 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single '천구상의 방위각을 계산한다. '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각 '즉, 시각좌표계에서 사용해야 함. ' If Math.Abs(x) >= Single.Epsilon Then If Math.Abs(y) >= Single.Epsilon Then '2) 일반적인 경우의 방위각 계산 Dim v1 As Single = Math.Atan(Math.Abs(x / y)) If y > 0 Then Return Math.Sign(x) * v1 '--> 예) (1,1)은 45도, (-1,1)은 -45도 Else Return Math.Sign(x) * (Math.PI - v1) '--> 예) (1,-1)은 135도, (-1,-1)은 -135도 End If Else '1) 특수한 경우의 방위각 계산 Return Math.Sign(x) * Math.PI / 2 '--> 예) (1,0)은 90도, (-1,0)은 -90도 End If Else '1) 특수한 경우의 방위각 계산 If y > 0 Then Return 0.0F '--> 예) (0,1)의 방위각은 0도 Else Return Math.PI '--> 예) (0,-1)의 방위각은 180도 End If End If ' End Function |
이보다 더 간단히 정리하면 다음과 같다.
1 2 3 4 5 6 7 8 |
Public Function GetAzimuthRadian(ByVal x As Single, ByVal y As Single) As Single '천구상의 방위각을 계산한다. '이 때 방위각은 y축의 양의 방향을 기준으로 시계방향으로 잰각 '즉, 시각좌표계에서 사용해야 함. ' Return Math.Atan2(x, y) ' End Function |