HtmlAgilityPack Attributes.Remove on Image Only는 두 개가있을 때 하나만 제거합니다.

attributes c# html-agility-pack

문제

우리 프로젝트에서 HtmlAgilityPack 을 사용하고 있기 때문에 다른 시스템에서 Html을 표시 할 수 있습니다. 나는 단위 테스트에서이 문제를 샅샅이 뒤졌고, 내가 틀린 일을하고 있지 않다는 것을 확실히하고 싶다. 이미지가 있고 2 개의 "src"값이있는 경우 하나를 선택하고 둘 다 제거한 다음 올바른 경로로 다시 추가하고 싶습니다. 나는 이것이 HTML로 일어날 것이라고 생각하지 않는다. 다만 ...

여기 이미지 태그의 예가 있습니다.

<img align=\"left\" alt=\"\" src=\"/blah.jpg\" src=\"/knowledge/blah.jpg\" border=\"0\" />

다음은 Html을 조작하는 코드입니다.

    public static string FixHtmlLinks(this string html)
    {
        var htmlDoc = new HtmlDocument()
        {
            OptionWriteEmptyNodes = true
        };
        htmlDoc.LoadHtml(html);

        var imagesToCheck = htmlDoc.DocumentNode.SelectNodes("//img[@src!='']");

        if (null != imagesToCheck)
        {
            foreach (var image in imagesToCheck.ToList())
            {
                var src = image.GetAttributeValue("src", string.Empty);
                if (Uri.IsWellFormedUriString(src, UriKind.Relative))
                {
                    image.Attributes.Remove("src");
                    image.SetAttributeValue("src", string.Format(RELATIVE_IMAGE_PROTOCOL_AND_HOST, src));
                }
                else if (Uri.IsWellFormedUriString(src, UriKind.Absolute))
                {
                    image.Attributes.Remove("src");
                    image.SetAttributeValue("src", src.Replace(ABSOLUTE_IMAGE_HOST_TO_REPLACE, IMAGE_PROTOCOL_AND_HOST));
                }
            }
        }

        return htmlDoc.DocumentNode.OuterHtml;
    }

디버깅 할 때 "image.Attributes.Remove ("src ");"줄에 도착하면 예상대로 2 개의 "src"값이 있습니다. 그 라인이 실행 된 후에 거기에 "/ 지식"으로 시작하는 "src"값이 1 개 있습니다. 그러나 제거에 대한 요약은 다음과 같이 표시되므로 둘 다 제거 될 것으로 예상됩니다.

이름을 사용해리스트로부터 속성을 삭제합니다. 이 이름을 가진 속성이 두 개 이상 있으면 모두 제거됩니다.

CodePlex에서 HtmlAttributeCollection의 소스 코드 를 확인한 다음 Remove 메서드를 사용하여 루프를 통해 값을 제거하므로 모든 작업이 제대로 수행 될 것입니다.

이 오류를 사용하고 있습니까, 아니면 HtmlAgilityPack에서 패치를 제공 할 기회를 찾았습니까?

수락 된 답변

확인 됨 : image.Attributes.Remove 는 첫 번째 발생 만 제거합니다.

한 가지 빠른 해결 방법은 Remove를 여러 번 호출하는 것입니다. 그것이 호출되었고 속성이 발견되지 않으면 아무것도하지 않습니다.

HtmlAgilityPack 작성자에게이를 알릴 수 있습니다.



Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow