Beispiel #1
0
        public string MaskByElementName(string xml, Predicate <string> elementNameSelector, MaskValue maskValue = null)
        {
            if (string.IsNullOrEmpty(xml))
            {
                throw new ArgumentException("xml must be not empty.", nameof(xml));
            }
            if (elementNameSelector is null)
            {
                throw new ArgumentNullException(nameof(elementNameSelector));
            }

            maskValue = maskValue ?? MaskingStrategies.Full;

            var chars = CharArrayPool.Rent(xml.Length);

            xml.CopyTo(0, chars, 0, xml.Length);

            var cursor = new TextCursor(chars);

            using (var xmlTextReader = XmlReader.Create(new StringReader(xml), _xmlReaderSettings))
                while (xmlTextReader.Read())
                {
                    if (xmlTextReader.NodeType == XmlNodeType.Element && elementNameSelector(xmlTextReader.LocalName))
                    {
                        ReadAndMask((IXmlLineInfo)xmlTextReader, chars, maskValue, ref cursor);
                    }
                }

            var maskedJson = new string(chars, 0, xml.Length);

            CharArrayPool.Return(chars);

            return(maskedJson);
        }
Beispiel #2
0
        public string MaskByXPath(string xml, string xPathSelector, MaskValue maskValue = null)
        {
            if (string.IsNullOrEmpty(xml))
            {
                throw new ArgumentException("xml must be not empty.", nameof(xml));
            }
            if (string.IsNullOrEmpty(xPathSelector))
            {
                throw new ArgumentNullException(nameof(xPathSelector));
            }

            var chars = CharArrayPool.Rent(xml.Length);

            xml.CopyTo(0, chars, 0, xml.Length);

            var cursor = new TextCursor(chars);

            using (var xmlTextReader = XmlReader.Create(new StringReader(xml), _xmlReaderSettings))
            {
                var document = new XPathDocument(xmlTextReader);
                foreach (XPathNavigator node in document.CreateNavigator().Select(xPathSelector))
                {
                    if (node.IsNode)
                    {
                        ReadAndMask((IXmlLineInfo)node, chars, maskValue ?? MaskingStrategies.Full, ref cursor);
                    }
                }
            }

            var maskedJson = new string(chars, 0, xml.Length);

            CharArrayPool.Return(chars);

            return(maskedJson);
        }
Beispiel #3
0
        internal static void ReadAndMask(IXmlLineInfo info, char[] chars, MaskValue maskValue, ref TextCursor cursor)
        {
            cursor.GoTo(info.LineNumber, info.LinePosition);
            cursor.FindSymbol('>');
            var cursorAtStartPosition = cursor;
            var startPosition         = cursor.Position + 1;

            cursor.FindSymbol('<');
            var endPosition = cursor.Position - 1;

            if (cursor.LineNumber == info.LineNumber)
            {
                maskValue(chars.AsSpan(startPosition, endPosition - startPosition + 1));
            }
            else
            {
                cursor = cursorAtStartPosition;
                cursor.GoToNextSymbol();
                while (cursor.Position <= endPosition)
                {
                    cursor.GoToNotWhiteSpaceSymbol();
                    var valueStartPosition = cursor.Position;
                    if (valueStartPosition >= endPosition)
                    {
                        return;
                    }
                    cursor.GoToLastLineSymbol();
                    var valueEndPosition = cursor.Position - 1;
                    maskValue(chars.AsSpan(valueStartPosition, valueEndPosition - valueStartPosition + 1));
                }
            }

            return;
        }