는 데 문제가와 XmlDocument C#
-
20-09-2019 - |
문제
하는 데 문제가 있습니다 내 프로그램을 읽을 이 XML 파일이 제대로 그것을 작성해야합니다 그것도 하지만 아직 없습니다.다만 이에만 조금의 코드
XmlDocument InstalledList = new XmlDocument();
InstalledList.Load(AppsInstalledFileNamePath);
//Sets the PackageNode to the correct part of the XmlDocument
XmlNodeList PackagesNode = InstalledList.GetElementsByTagName("installed");
foreach (XmlNode InstalledListNodes in PackagesNode)
{
//If the title is the same as what the user typed, continue on
if (InstalledListNodes.Attributes["title"].InnerText.Equals(packagename) == true)
{
BatchProcessFileName = InstalledListNodes.Attributes["uninstallername"].InnerText;
Console.WriteLine("Filename OK");
이 try 문 밖으로 그렇게 하지 않았을 추가 캐치
아래는 XML 파일을 읽는(나중에 쓰기)
<?xml version="1.0" encoding="utf-8" ?>
<packages>
<installed>
<sampleapp title="sampleapp" id="00001" uninstallername="sampleapp.bat" installdate="11/15/09"></sampleapp>
<sampleapp2 title="sampleapp2" id="00002" uninstallername="sampleapp2.bat" installdate="11/16/09"></sampleapp2>
</installed>
<uninstalled>
</uninstalled>
</packages>
코드는 실행되지만,그것은 NullReference 예외에서
InstalledListNodes.Attributes["title"].InnerText.Equals(packagename) == true
해결책
참고 및과는 반대로 믿는다: InnerText
은 결코 null
에 대한 특성 또는 요소.는지 확인 InnerText
는 null 입니다.빈 요소 및 특성을 빈 문자열 InnerText
:
XmlDocument docx = new XmlDocument();
docx.LoadXml("<root test='' />");
Debug.WriteLine("Empty: " + docx.FirstChild.InnerText);
Debug.WriteLine("Empty: " + docx.FirstChild.Attributes["test"].InnerText);
그러나,특성이 반환할 수 있습 자체가 null
는 경우 그것은 존재하지 않습니다.그것은 쓸모없는,이미 지적해 jrista,사용 InnerText
지 않는 한 당신은 정말이 있습니다.틱 Value
대신 합니다.
고 문제 해결
이 댓글을 달았습니다.이 있:
XmlNodeList PackagesNode = InstalledList.GetElementsByTagName("installed");
foreach (XmlNode InstalledListNodes in PackagesNode)
{
if (InstalledListNodes.Attributes["title"].InnerText.Equals(packagename) == true)
....
XML 을 보였다,이것은 결코 작품으로, <installed>
하지 않는 특성이 있습니다.Try:
XmlNodeList PackagesNode = InstalledList.GetElementsByTagName("installed");
foreach (XmlNode InstalledListNodes in PackagesNode)
{
XmlNode someNode = InstalledListNodes.FirstChild;
if (someNode.Attributes["title"].InnerText.Equals(packagename) == true)
....
하지 않습니다(아직)에게 당신이 원하는 효과만 someNode
이 포인트는 노드를 실제로는 타이틀을 가지고 특성을 보여주는,당신을 제거하는 방법 이 오류가 있습니다.
에는 간편한 솔루션:즉
제거 후에 오류가 당신을 보여주는 또 다른 방법:XPath.이 형식의 작업은 정말로 많이 사용하여 쉽게 XPath.여기에 내에서 당신의 문제(시험하지 않):
// assuming <packages> is root:
XmlNodeList applicationNodes = InstalledList.SelectNodes("/packages/installed/*");
foreach (XmlNode applicationNode in applicationNodes)
{
if (applicationNode.Attributes["title"].Value.Equals(packagename) == true)
{
.... etc
중요 사항:다른 사람이 무엇에 대해 말했다 확인하는 값을 반환 노드의 단계입니다 여전히 매우 중요합니다.어떤 경우의 입력 데이터가 없다면,당신의 코드 실패할 것이 어렵습니다.단지 항상 확인 매 단계마나 더 많이 사용 XPath 을 할 수 있습니다.
업데이트: 참고로
업데이트: 추가 솔루션
업데이트: 추가 대체 솔루션(저항할 수 없었)
다른 팁
작은 오타처럼 보입니다.
당신이 쓴 참고 Attributes["unintallername"]
그리고 그것은되어야합니다 Attributes["uninstallername"]
글쎄, 나는 다음 줄에서 세 가지 다른 실패 지점을 볼 수 있습니다.
InstalledListNodes.Attributes["title"].InnerText.Equals(packagename) == true
^--Null? ^-- Null? ^--Null?
나는 그 긴 사슬을 더 이산적인 요소로 나누고 각각 null을 확인하여 그것을 좁힐 것입니다.
if (InstalledListNodes != null)
{
var attribute = InstalledListNodes.Attributes["title"];
if (attribute != null)
{
if (attribute.InnerText.Equals(packagename) == true)
{
// ...
}
}
}
즉, 나는 그것을 사용할 것입니다 .값 그보다는 속성 .innerText 속성 값을 검색 할 때 속성. 내부 텍스트는 요소 열기 및 닫기 태그 내에서 텍스트 내용을 검색 할 때 사용해야합니다.