문제

하는 데 문제가 있습니다 내 프로그램을 읽을 이 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 속성 값을 검색 할 때 속성. 내부 텍스트는 요소 열기 및 닫기 태그 내에서 텍스트 내용을 검색 할 때 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top